CASE 表达式
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 | test |
|---|---|
| 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 | test |
|---|---|
| 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 | test |
|---|---|
| 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 | test |
|---|---|
| 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;