9.17.1. CASE
Der SQL CASE-Ausdruck ist ein allgemeiner bedingter Ausdruck, ähnlich den if/else-Anweisungen in anderen Programmiersprachen:
CASE WHEN condition THEN result END
CASE-Klauseln können überall dort verwendet werden, wo ein Ausdruck gültig ist. Jede Bedingung ist ein Ausdruck, der ein boolesches Ergebnis liefert. Wenn das Ergebnis der Bedingung wahr ist, ist der Wert des CASE-Ausdrucks das Ergebnis, das auf die Bedingung folgt, und der Rest des CASE-Ausdrucks wird nicht verarbeitet. Wenn das Ergebnis der Bedingung nicht wahr ist, werden alle nachfolgenden WHEN-Klauseln auf die gleiche Weise untersucht. Wenn keine WHEN-Bedingung wahr ist, ist der Wert des CASE-Ausdrucks das Ergebnis der ELSE-Klausel. Wenn die ELSE-Klausel weggelassen wird und keine Bedingung wahr ist, ist das Ergebnis null.
Ein Beispiel:
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
Die Datentypen aller Ergebnisausdrücke müssen in einen einzigen Ausgabetyp konvertierbar sein. Weitere Einzelheiten finden Sie in Abschnitt 10.5.
Es gibt eine „einfache“ Form des CASE-Ausdrucks, die eine Variante der obigen allgemeinen Form ist:
CASE expression WHEN value THEN result END
Der erste Ausdruck wird berechnet und dann mit jedem der Wertausdrücke in den WHEN-Klauseln verglichen, bis einer gefunden wird, der gleich ist. Wenn keine Übereinstimmung gefunden wird, wird das Ergebnis der ELSE-Klausel (oder ein Nullwert) zurückgegeben. Dies ähnelt der switch
-Anweisung in C.
Das obige Beispiel kann mit der einfachen CASE-Syntax geschrieben werden:
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
Ein CASE-Ausdruck wertet keine Unterausdrücke aus, die zur Ermittlung des Ergebnisses nicht benötigt werden. Dies ist z.B. eine Möglichkeit, einen Fehler bei der Division durch Null zu vermeiden:
SELECT ... WHERE CASE WHEN x <> 0 THEN y/x > 1.5 ELSE false END;
Anmerkung: Wie in Abschnitt 4.2.14 beschrieben, gibt es verschiedene Situationen, in denen Unterausdrücke eines Ausdrucks zu unterschiedlichen Zeitpunkten ausgewertet werden, so dass der Grundsatz „CASE wertet nur notwendige Unterausdrücke aus“ nicht unumstößlich ist. Beispielsweise führt ein konstanter 1/0-Unterausdruck zur Planungszeit in der Regel zu einem Division-durch-Null-Fehler, auch wenn er sich innerhalb eines CASE-Arms befindet, der zur Laufzeit nie eingegeben würde.