9.17.1. CASE
SQL:s CASE-uttryck är ett generiskt villkorligt uttryck som liknar if/else-satser i andra programmeringsspråk:
CASE WHEN condition THEN result END
CASE-klausuler kan användas överallt där ett uttryck är giltigt. Varje villkor är ett uttryck som returnerar ett boolskt resultat. Om villkorets resultat är sant är värdet av CASE-uttrycket det resultat som följer på villkoret, och resten av CASE-uttrycket behandlas inte. Om villkorets resultat inte är sant granskas alla efterföljande WHEN-klausuler på samma sätt. Om inget WHEN-villkor är sant är värdet av CASE-uttrycket resultatet av ELSE-klausulen. Om ELSE-klausulen utelämnas och inget villkor är sant är resultatet noll.
Ett exempel:
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
Datatyperna för alla resultatuttryck måste kunna konverteras till en enda utdatatyp. Se avsnitt 10.5 för mer information.
Det finns en ”enkel” form av CASE-uttryck som är en variant av den allmänna formen ovan:
CASE expression WHEN value THEN result END
Det första uttrycket beräknas och jämförs sedan med vart och ett av värdeuttrycken i WHEN-klausulerna tills man hittar ett som är lika med det. Om ingen matchning hittas returneras resultatet av ELSE-klausulen (eller ett nollvärde). Detta liknar switch
-anvisningen i C.
Exemplet ovan kan skrivas med hjälp av den enkla CASE-syntaxen:
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
Ett CASE-uttryck utvärderar inte några deluttryck som inte behövs för att bestämma resultatet. Detta är till exempel ett möjligt sätt att undvika ett fel vid division genom noll:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Anmärkning: Som beskrivs i avsnitt 4.2.14 finns det olika situationer där deluttryck av ett uttryck utvärderas vid olika tidpunkter, så att principen att ”CASE utvärderar endast nödvändiga deluttryck” inte är vattentät. Till exempel kommer ett konstant 1/0-underuttryck vanligtvis att resultera i ett division-för-noll-fel vid planeringstiden, även om det ligger inom en CASE-arm som aldrig skulle anges vid körtiden.