- Kategorien:
CASE¶
Funktioniert wie eine kaskadierende „if-then-else“-Anweisung. In der allgemeineren Form wird eine Reihe von Bedingungen nacheinander ausgewertet. Wenn eine Bedingung zu TRUE ausgewertet wird, stoppt die Auswertung und wird das zugehörige Ergebnis (nach THEN) zurückgegeben. Wenn keine der Bedingungen zu TRUE ausgewertet wird, wird das Ergebnis nach dem optionalen ELSE zurückgegeben (sofern vorhanden); andernfalls wird NULL zurückgegeben.
In der zweiten „Abkürzungsform“ wird der Ausdruck nach CASE mit jedem der WHEN-Ausdrücke in der Reihenfolge verglichen, bis einer übereinstimmt; dann wird das zugehörige Ergebnis (nach THEN) zurückgegeben. Wenn keiner der Ausdrücke übereinstimmt, wird das Ergebnis nach dem optionalen ELSE zurückgegeben, sofern vorhanden, andernfalls wird NULL zurückgegeben.
Beachten Sie, dass in der zweiten Form ein NULL CASE-Ausdruck mit keinem der WHEN-Ausdrücke übereinstimmt, auch wenn einer der WHEN-Ausdrücke ebenfalls NULL ist.
- Siehe auch::
Syntax¶
CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END
CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  [ ... ]
  [ ELSE <result3> ]
END
Argumente¶
- condition#
- In der ersten Form von - CASEist jede Bedingung ein Ausdruck, der einen Wert von BOOLEAN (True, False oder NULL) auswerten soll.
- expr
- Ein allgemeiner Ausdruck. 
- value
- In der zweiten Form von - CASEist jeder- value-Wert eine potenzielle Übereinstimmung mit dem- expr-Wert. Der- valuekann ein Literal oder ein Ausdruck sein. Der- value-Wert muss vom gleichen Datentyp wie der- expr-Wert sein oder muss ein Datentyp sein, der in den Datentyp des- expr-Werts umgewandelt werden kann.
- result#
- Wenn in der ersten Form der - CASE-Klausel der- condition#-Wert „true“ ergibt, gibt die Funktion den entsprechenden- result#-Wert zurück. Wenn mehr als eine Bedingung wahr ist, wird das mit der ersten wahr-Bedingung verknüpfte Ergebnis zurückgegeben.- Wenn in der zweiten Form der - CASE-Anweisung der- value#-Wert mit dem- expr-Wert übereinstimmt, wird der entsprechende- result-Wert zurückgegeben. Wenn mehr als ein- value-Wert mit dem- expr-Wert übereinstimmt, wird der- result-Wert des ersten übereinstimmenden Werts zurückgegeben.- Das Ergebnis sollte ein Ausdruck sein, der einen einzelnen Wert ergibt. - Wenn in beiden Formen von - CASEeine optionale- ELSE-Klausel vorhanden ist und keine Übereinstimmungen gefunden werden, gibt die Funktion das Ergebnis in der- ELSE-Klausel zurück. Wenn keine- ELSE-Klausel vorhanden ist und keine Übereinstimmungen gefunden werden, lautet das Ergebnis NULL.
Nutzungshinweise¶
- Beachten Sie, dass im Gegensatz zu DECODE ein NULL-Wert in der Bedingung nicht mit einem NULL-Wert an anderer Stelle in der Bedingung übereinstimmt. So gibt zum Beispiel - WHEN <Null-Ausdruck> = NULL THEN 'Return me!'nicht „Return me!“ zurück. Wenn Sie einen Vergleich mit NULL-Werten möchten, verwenden Sie- IS NULLanstelle von- = NULL.
- Die Werte von - condition#,- expr,- valueund- resultkönnen allgemeine Ausdrücke sein und daher Unterabfragen mit Mengenoperatoren wie- UNION,- INTERSECT,- EXCEPTund- MINUSenthalten. Stellen Sie bei der Verwendung von Mengenoperatoren sicher, dass die Datentypen kompatibel sind. Weitere Informationen dazu finden Sie unter Allgemeine Nutzungshinweise unter dem Thema Mengenoperatoren.
Sortierungsdetails¶
In der ersten Form von CASE ist jeder Ausdruck unabhängig, und die Sortierungsspezifikationen in verschiedenen Zweigen sind unabhängig. Beispielsweise sind im Folgenden die Sortierungsspezifikationen in condition1 unabhängig von den Sortierungsspezifikationen in condition2, und diese Sortierungsspezifikationen müssen nicht identisch und auch nicht kompatibel sein.
CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
In der zweiten Form von CASE müssen zwar für alle sortierungsbezogenen Operationen kompatible Sortierungsspezifikationen verwendet werden, die Sortierungsspezifikationen müssen jedoch nicht identisch sein. In der folgenden Anweisung beispielsweise müssen die Sortierungsspezifikationen von value1 und value2 mit der Sortierungsspezifikation von expr kompatibel sein, aber die Sortierungsspezifikationen von value1 und value2 müssen nicht identisch sein oder mit der Sortierungsspezifikation von expr übereinstimmen.
CASE <expr> WHEN <value1> THEN <result1> [ WHEN <value2> THEN <result2> ] ...
Der von der Funktion zurückgegebene Wert hat die Sortierung mit der höchsten Priorität der THEN/ELSE-Argumente.
Beispiele¶
Dieses Beispiel zeigt eine typische Verwendung von CASE:
SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
        ELSE 'other'
    END AS result
FROM (values(1),(2),(3)) v;
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+
Dieses Beispiel zeigt, dass, wenn keiner der Werte übereinstimmt und keine ELSE-Klausel vorhanden ist, der zurückgegebene Wert NULL ist:
SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
    END AS result
FROM (values(1),(2),(3)) v;
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+
In diesem Beispiel wird NULL explizit behandelt.
SELECT
    column1,
    CASE 
        WHEN column1 = 1 THEN 'one'
        WHEN column1 = 2 THEN 'two'
        WHEN column1 IS NULL THEN 'NULL'
        ELSE 'other'
    END AS result
FROM VALUES (1), (2), (NULL);
+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+
Die folgenden Beispiele kombinieren CASE mit Sortierung:
SELECT CASE COLLATE('m', 'upper')
    WHEN 'M' THEN TRUE
    ELSE FALSE
END;
+----------------------------+
| CASE COLLATE('M', 'UPPER') |
|     WHEN 'M' THEN TRUE     |
|     ELSE FALSE             |
| END                        |
|----------------------------|
| True                       |
+----------------------------+
SELECT CASE 'm'
    WHEN COLLATE('M', 'lower') THEN TRUE
    ELSE FALSE
END;
+------------------------------------------+
| CASE 'M'                                 |
|     WHEN COLLATE('M', 'LOWER') THEN TRUE |
|     ELSE FALSE                           |
| END                                      |
|------------------------------------------|
| True                                     |
+------------------------------------------+