case
CASE 是一种条件表达式。如果 WHEN 子句中的条件计算结果为 true,则返回 THEN 子句中的结果。如果所有条件计算结果均为 false,则返回可选的 ELSE 子句中的结果。如果不存在 ELSE 子句,则返回 NULL。
语法
CASE 表达式有两种形式
- 简单 CASE
CASE expression
WHEN expression1 THEN result1
[WHEN expression2 THEN result2]
...
[WHEN expressionN THEN resultN]
[ELSE result]
END
对于此语法,将 `expression` 与 WHEN 子句中的每个表达式进行比较。 如果找到相等的表达式,则返回 THEN 子句中的结果。 如果未找到相等的表达式,则如果存在 ELSE,则返回 ELSE 子句中的结果。
- 搜索 CASE
CASE WHEN condition1 THEN result1
[WHEN condition2 THEN result2]
...
[WHEN conditionN THEN resultN]
[ELSE result]
END
对于此语法,计算 WHEN 子句中的每个条件,直到其中一个条件为 true,然后返回 THEN 子句中的相应结果。 如果没有条件计算结果为 true,则如果存在 ELSE,则返回 ELSE 子句中的结果。
第一个 CASE 等于第二个 CASE,如下所示
CASE WHEN expression = expression1 THEN result1
[WHEN expression = expression2 THEN result2]
...
[WHEN expression = expressionN THEN resultN]
[ELSE result]
END
参数
-
`expressionN`:要比较的表达式。多个表达式的数据类型必须兼容。
-
`conditionN`:可以计算为布尔值的条件。
-
`resultN` 的数据类型必须兼容。
返回值
返回值是 THEN 子句中所有类型的公共类型。
示例
假设表 `test_case` 具有以下数据
CREATE TABLE test_case(
name STRING,
gender INT,
) DISTRIBUTED BY HASH(name);
INSERT INTO test_case VALUES
("Andy",1),
("Jules",0),
("Angel",-1),
("Sam",null);
SELECT * FROM test_case;
+-------+--------+
| name | gender |
+-------+--------+
| Angel | -1 |
| Andy | 1 |
| Sam | NULL |
| Jules | 0 |
+-------+--------+-------+
使用简单 CASE
- 指定了 ELSE,如果找不到相等的表达式,则返回 ELSE 中的结果。
mysql> select gender, case gender
when 1 then 'male'
when 0 then 'female'
else 'error'
end gender_str
from test_case;
+--------+------------+
| gender | gender_str |
+--------+------------+
| NULL | error |
| 0 | female |
| 1 | male |
| -1 | error |
+--------+------------+
- 如果未指定 ELSE 并且没有条件计算结果为 true,则返回 NULL。
select gender, case gender
when 1 then 'male'
when 0 then 'female'
end gender_str
from test_case;
+--------+------------+
| gender | gender_str |
+--------+------------+
| 1 | male |
| -1 | NULL |
| NULL | NULL |
| 0 | female |
+--------+------------+
使用未指定 ELSE 的搜索 CASE
mysql> select gender, case when gender = 1 then 'male'
when gender = 0 then 'female'
end gender_str
from test_case;
+--------+------------+
| gender | gender_str |
+--------+------------+
| NULL | NULL |
| -1 | NULL |
| 1 | male |
| 0 | female |
+--------+------------+
关键词
case when, case, case_when, case...when