跳到主要内容
版本: 最新版本-3.5

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