跳到主要内容

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;
itest
10
20
31

这等价于:

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;
itest
110
220
30

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;
itest
110
2NULL
3NULL

也可以在 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;
itest
110
220
330

这等价于:

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