CASE 语句根据条件执行切换。基本形式与许多编程语言中使用的三元条件相同(CASE WHEN cond THEN a ELSE b END 等同于 cond ? a : b)。对于单一条件,可以使用 IF(cond, a, b) 来表达。
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 | 测试 |
|---|---|
| 1 | 0 |
| 2 | 0 |
| 3 | 1 |
这相当于:
SELECT i, IF(i > 2, 1, 0) AS test
FROM integers;
CASE 语句中的 WHEN cond THEN expr 部分可以链式连接,每当任何一个条件对单个元组返回 true 时,相应的表达式就会被评估并返回。
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 | 测试 |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | 0 |
CASE 语句的 ELSE 部分是可选的。如果没有提供 else 语句且没有任何条件匹配,CASE 语句将返回 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 | 测试 |
|---|---|
| 1 | 10 |
| 2 | NULL |
| 3 | NULL |
也可以在CASE之后但在WHEN之前提供一个单独的表达式。这样做时,CASE语句实际上被转换为一个switch语句。
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 | 测试 |
|---|---|
| 1 | 10 |
| 2 | 20 |
| 3 | 30 |
这相当于:
SELECT i, CASE WHEN i = 1 THEN 10 WHEN i = 2 THEN 20 WHEN i = 3 THEN 30 END AS test
FROM integers;