Kategorien:

Funktionen für bedingte Ausdrücke

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:

IFF

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
Copy

Argumente

condition#

In der ersten Form von CASE ist 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 CASE ist jeder value-Wert eine potenzielle Übereinstimmung mit dem expr-Wert. Der value kann 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 CASE eine 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 NULL anstelle von = NULL.

  • Die Werte von condition#, expr, value und result können allgemeine Ausdrücke sein und daher Unterabfragen mit Mengenoperatoren wie UNION, INTERSECT, EXCEPT und MINUS enthalten. 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> ]
Copy

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> ]
  ...
Copy

Der von der Funktion zurückgegebene Wert hat die Sortierung mit der höchsten Priorität der THEN/ELSE-Argumente.

Beispiele

Dies 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;
Copy

Ausgabe:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+
Copy

Dies 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;
Copy

Ausgabe:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+
Copy

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);
Copy

Ausgabe:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+
Copy

Das folgende Beispiel kombiniert 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                                     |
+------------------------------------------+
Copy