9.17.1. CASE
SQL CASE-udtrykket er et generisk betinget udtryk, svarende til if/else-udsagn i andre programmeringssprog:
CASE WHEN condition THEN result END
CASE-klausuler kan bruges overalt, hvor et udtryk er gyldigt. Hver betingelse er et udtryk, der returnerer et boolsk resultat. Hvis betingelsens resultat er sandt, er værdien af CASE-udtrykket det resultat, der følger efter betingelsen, og resten af CASE-udtrykket bliver ikke behandlet. Hvis betingelsens resultat ikke er sandt, undersøges eventuelle efterfølgende WHEN-klausuler på samme måde. Hvis ingen WHEN-bestemmelse giver sandt resultat, er værdien af CASE-udtrykket resultatet af ELSE-klausulen. Hvis ELSE-klausulen udelades, og ingen betingelse er sand, er resultatet nul.
Eksempel:
SELECT * FROM test; a--- 1 2 3SELECT a, CASE WHEN a=1 THEN 'one' WHEN a=2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
Datatyperne for alle resultatudtrykkene skal kunne konverteres til en enkelt udgangstype. Se afsnit 10.5 for yderligere oplysninger.
Der findes en “simpel” form for CASE-udtryk, som er en variant af den generelle form ovenfor:
CASE expression WHEN value THEN result END
Det første udtryk beregnes og sammenlignes derefter med hvert af værdiudtrykkene i WHEN-klausulerne, indtil der findes et udtryk, der er lig med det. Hvis der ikke findes nogen overensstemmelse, returneres resultatet af ELSE-klausulen (eller en nulværdi). Dette svarer til switch
-erklæringen i C.
Eksemplet ovenfor kan skrives ved hjælp af den simple CASE-syntaks:
SELECT a, CASE a WHEN 1 THEN 'one' WHEN 2 THEN 'two' ELSE 'other' END FROM test; a | case---+------- 1 | one 2 | two 3 | other
Et CASE-udtryk evaluerer ikke nogen underudtryk, der ikke er nødvendige for at bestemme resultatet. Dette er f.eks. en mulig måde at undgå en fejl ved division ved nul:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Bemærk: Som beskrevet i afsnit 4.2.14 er der forskellige situationer, hvor underudtryk af et udtryk evalueres på forskellige tidspunkter, så princippet om, at “CASE evaluerer kun nødvendige underudtryk” er ikke jernhårdt. F.eks. vil et konstant 1/0 underudtryk normalt resultere i en fejl ved division ved nul på planlægningstidspunktet, selv om det ligger inden for en CASE-arm, der aldrig ville blive indtastet på kørselstidspunktet.