
Ved Renden 31 2870 Dyssegaard Tel. +45 23 34 54 43
| 
MainframeSupports tip uge 17/2012:
Et af mine allerførste tip handler om, at funktionen DECIMAL er i stand til at oversætte
numeriske data i en tegnstreng til et numerisk format. Desværre har funktionen den kedelige
sideeffekt, at den giver en negativ SQLCODE, hvis tegnstrengen indeholder ikke-numeriske
data. Siden da er SQL til DB2 blevet udvidet med funktionen TRANSLATE, som kan anvendes til
rigtig mange forskellige ting, heriblandt at validere numeriske data.
Hvis du har en kolonne defineret som en CHAR eller VARCHAR, og du ønsker at finde ud af,
om kolonnen kun indeholder tegnene 0 til 9 og dermed kun indeholder numeriske værdier, kan
du gøre det med følgende SQL statement:
SELECT keyColumn, columnX
FROM tableA
WHERE TRANSLATE(columnX, '*', ' 0123456789') <> ''
Dette SQL statement vil finde de rækker, hvor columnX indeholder andre tegn end numeriske
tegn. Hvis SQL statementet ikke returnerer nogen rækker, så er columnX numerisk for alle
rækker. Hvis du ved, at columnX kan indeholde foranstillede eller efterstillede blanke kan
du bruge TRANSLATE(STRIP(columnX)... i stedet. Det bliver straks langt sværere, hvis en
kolonne skal valideres for numeriske data med . eller , i. Det kan ikke klares med en
TRANSLATE eller nogen anden funktion i SQL. DECIMAL kan konvertere, men desværre ikke
validere.
Bemærk detaljen med at en blank oversættes til et tegn, der ikke er blank. Jeg
har valgt en *, men hvilket som helst tegn kan anvendes. Uden denne detalje, vil blanke blive
accepteret på lige fod med et hvilket som helst numerisk tegn. Ideen med at anvende TRANSLATE
til validering af numeriske data kan udvides til validering af alle mulige former for tegn.
Det eneste du skal huske er, at TRANSLATE kun kan validere værdien at hvert enkelt tegn
i en CHAR eller VARCHAR kolonne, men ikke en bestemt rækkefølge af tegn.
Forrige danske tip
Last tip in english
Tip oversigten
|