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 testFROM integers;| i | test |
|---|---|
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
Das ist gleichwertig mit:
SELECT i, IF(i > 2, 1, 0) AS testFROM 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 testFROM 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 testFROM 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 testFROM 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 testFROM 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 testFROM 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 testFROM integers;| i | test |
|---|---|
| 1 | one |
| 2 | two |
| 3 | other |