9.17.1. CASE

De SQL CASE expressie is een generieke voorwaardelijke expressie, vergelijkbaar met if/else statements in andere programmeertalen:

CASE WHEN condition THEN result END

CASE clausules kunnen overal worden gebruikt waar een expressie geldig is. Elke voorwaarde is een uitdrukking die een booleaans resultaat oplevert. Als het resultaat van de voorwaarde waar is, is de waarde van de CASE-uitdrukking het resultaat dat volgt op de voorwaarde, en wordt de rest van de CASE-uitdrukking niet verwerkt. Als het resultaat van de voorwaarde niet waar is, worden alle volgende WHEN-clausules op dezelfde manier onderzocht. Als geen enkele WHEN voorwaarde waar is, is de waarde van de CASE uitdrukking het resultaat van de ELSE clausule. Als de ELSE-clausule wordt weggelaten en geen enkele voorwaarde waar is, is het resultaat null.

Een voorbeeld:

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

De gegevenstypen van alle resultaatexpressies moeten naar een enkel uitgangstype converteerbaar zijn. Zie Paragraaf 10.5 voor meer bijzonderheden.

Er bestaat een “eenvoudige” vorm van de CASE-uitdrukking die een variant is van de algemene vorm hierboven:

CASE expression WHEN value THEN result END

De eerste uitdrukking wordt berekend en vervolgens vergeleken met elk van de waarde-uitdrukkingen in de WHEN-clausules totdat er een wordt gevonden die daaraan gelijk is. Als er geen overeenkomst wordt gevonden, wordt het resultaat van de ELSE-clausule (of een nulwaarde) teruggegeven. Dit is vergelijkbaar met het switch statement in C.

Het bovenstaande voorbeeld kan worden geschreven met behulp van de eenvoudige CASE syntaxis:

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

Een CASE expressie evalueert geen subexpressies die niet nodig zijn om het resultaat te bepalen. Dit is bijvoorbeeld een mogelijke manier om een “division-by-zero” fout te voorkomen:

SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;

Noot: Zoals beschreven in Paragraaf 4.2.14, zijn er verschillende situaties waarin subexpressies van een expressie op verschillende tijdstippen worden geëvalueerd, zodat het principe dat “CASE alleen noodzakelijke subexpressies evalueert” niet onwrikbaar is. Bijvoorbeeld een constante 1/0 subexpressie zal gewoonlijk resulteren in een division-by-zero-fout op planningstijd, zelfs als deze zich bevindt binnen een CASE-arm die nooit zou worden ingevoerd op runtime.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.