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

Argumente

Bedingung#

In der ersten Form von CASE ist jede Bedingung ein Ausdruck, der einen Wert von BOOLEAN (True, False oder NULL) auswerten soll.

Ausdruck

Ein allgemeiner Ausdruck.

Wert

In der zweiten Form von CASE ist jeder Wert eine potenzielle Übereinstimmung mit Ausdruck. Der Wert kann ein Literal oder ein Ausdruck sein. Der Wert muss vom gleichen Datentyp wie Ausdruck sein oder muss ein Datentyp sein, der in den Datentyp von Ausdruck umgewandelt werden kann.

Ergebnis#

Wenn in der ersten Form der CASE-Klausel die Bedingung# erfüllt ist, gibt die Funktion das entsprechende Ergebnis# 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 Wert# mit Ausdruck übereinstimmt, wird das entsprechende Ergebnis zurückgegeben. Wenn mehr als ein Wert mit Ausdruck übereinstimmt, wird das Ergebnis 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.

  • Bedingung#, Ausdruck, Wert und Ergebnis 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 Bedingung1 unabhängig von den Sortierungsspezifikationen in Bedingung2, und diese Sortierungsspezifikationen müssen nicht identisch und nicht einmal 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 Wert1 und Wert2 mit der Sortierungsspezifikation von Ausdruck kompatibel sein, aber die Sortierungsspezifikationen von Wert1 und Wert2 müssen nicht identisch sein oder mit der Sortierungsspezifikation von Ausdruck ü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

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;

Ausgabe:

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

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;

Ausgabe:

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

Ausgabe:

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

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                                     |
+------------------------------------------+