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;