Zum Inhalt springen

CASE-Ausdruck

Der Ausdruck CASE führt eine Verzweigung anhand einer Bedingung aus. Die Grundform entspricht der ternären Bedingung vieler Programmiersprachen (CASE WHEN cond THEN a ELSE b END ist gleichwertig mit cond ? a : b). Bei einer einzelnen Bedingung lässt sich das mit IF(cond, a, b) ausdrücken.

CREATE OR REPLACE TABLE integers AS SELECT unnest([1, 2, 3]) AS i;
SELECT i, CASE WHEN i > 2 THEN 1 ELSE 0 END AS test
FROM integers;
i test
1 0
2 0
3 1

Das ist gleichwertig mit:

SELECT i, IF(i > 2, 1, 0) AS test
FROM integers;

Der Teil WHEN cond THEN expr des CASE-Ausdrucks kann verkettet werden: Sobald eine der Bedingungen für ein Tupel wahr ist, wird der zugehörige Ausdruck ausgewertet und zurückgegeben.

CREATE OR REPLACE TABLE integers AS SELECT unnest([1, 2, 3]) AS i;
SELECT i, CASE WHEN i = 1 THEN 10 WHEN i = 2 THEN 20 ELSE 0 END AS test
FROM integers;
i test
1 10
2 20
3 0

Die Klausel ELSE des CASE-Ausdrucks ist optional. Wird keine ELSE-Klausel angegeben und trifft keine Bedingung zu, liefert der CASE-Ausdruck NULL.

CREATE OR REPLACE TABLE integers AS SELECT unnest([1, 2, 3]) AS i;
SELECT i, CASE WHEN i = 1 THEN 10 END AS test
FROM integers;
i test
1 10
2 NULL
3 NULL

Es ist auch möglich, nach CASE und vor WHEN einen einzelnen Ausdruck anzugeben. Dann wird der CASE-Ausdruck faktisch in eine switch-Anweisung umgewandelt.

CREATE OR REPLACE TABLE integers AS SELECT unnest([1, 2, 3]) AS i;
SELECT i, CASE i WHEN 1 THEN 10 WHEN 2 THEN 20 WHEN 3 THEN 30 END AS test
FROM integers;
i test
1 10
2 20
3 30

Das ist gleichwertig mit:

SELECT i, CASE WHEN i = 1 THEN 10 WHEN i = 2 THEN 20 WHEN i = 3 THEN 30 END AS test
FROM integers;

SWITCH-Ausdruck

Der Ausdruck SWITCH ist syntaktischer Zucker für den CASE-Ausdruck. Er nimmt einen Ausdruck, eine MAP von Werten auf Ergebnisse und einen optionalen Standardwert entgegen.

CREATE OR REPLACE TABLE integers AS SELECT unnest([1, 2, 3]) AS i;
SELECT i, SWITCH(i, MAP {1: 'one', 2: 'two', 3: 'three'}) AS test
FROM integers;
i test
1 one
2 two
3 three

Als drittes Argument kann ein Standardwert angegeben werden, der zurückgegeben wird, wenn keiner der Map-Schlüssel zutrifft:

SELECT i, SWITCH(i, MAP {1: 'one', 2: 'two'}, 'other') AS test
FROM integers;
i test
1 one
2 two
3 other