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