- 类别:
CASE¶
工作方式类似于级联的“if-then-else”语句。在更常规的形式中,按顺序计算一系列条件。当某条件的计算结果为 TRUE 时,计算停止并返回关联的结果( THEN 之后)。如果所有条件的评估结果都不是 TRUE,则返回可选 ELSE 之后的结果(如果存在);否则返回 NULL。
在第二种“简写”形式中,CASE 之后的表达式与每个 WHEN 表达式按顺序进行比较,直到有一个表达式匹配为止;然后返回关联的结果( THEN 之后)。如果所有表达式都不匹配,则返回可选 ELSE 之后的结果(如果存在);否则返回 NULL。
请注意,在第二种形式中,NULL CASE 表达式不匹配任何 WHEN 表达式,即使其中一个 WHEN 表达式也是 NULL。
- 另请参阅:
语法¶
CASE
WHEN <condition1> THEN <result1>
[ WHEN <condition2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
CASE <expr>
WHEN <value1> THEN <result1>
[ WHEN <value2> THEN <result2> ]
[ ... ]
[ ELSE <result3> ]
END
实参¶
condition#
在第一种
CASE
形式中,每个条件都是一个表达式,其计算结果应为 BOOLEAN 值(True、False 或 NULL)。expr
通用表达式。
value
在的第二种
CASE
形式中,每个value
都是expr
的潜在匹配项。value
可以是字面量或表达式。value
必须与expr
具有相同的数据类型,或者必须是可以转换为expr
的数据类型的数据类型。result#
在第一种形式的
CASE
子句中,如果condition#
为 True,则函数返回相应的result#
。如果多个条件为 True,则返回与第一个 True 条件关联的结果。在第二种形式的
CASE
语句中,如果value#
与expr
匹配,则返回相应的result
。如果有多个value
与expr
匹配,则返回第一个匹配值的result
。结果应为计算结果为单个值的表达式。
在两种形式的
CASE
中,如果存在可选ELSE
子句,并且未找到匹配项,则函数返回ELSE
子句中的结果。如果不存在ELSE
子句,并且未找到匹配项,则结果为 NULL。
使用说明¶
排序规则详细信息¶
在第一种形式的 CASE
中,每个表达式都独立,不同分支中的排序规则规范也独立。例如,在以下语句中,condition1
中的排序规则规范与 condition2
中的排序规则规范无关,并且这些排序规则规范不需要相同甚至兼容。
CASE
WHEN <condition1> THEN <result1>
[ WHEN <condition2> THEN <result2> ]
在第二种形式的 CASE
中,尽管所有与排序规则相关的操作都必须使用兼容的排序规则规范,但排序规则规范不必完全相同。例如,在下面的语句中,value1
和 value2
的排序规则规范必须与 expr
的排序规则规范兼容,但 value1
和 value2
的排序规则规范不需要彼此相同,也不需要与 expr
的排序规则规范相同。
CASE <expr> WHEN <value1> THEN <result1> [ WHEN <value2> THEN <result2> ] ...
函数返回的值在 THEN
ELSE
实参中具有最高的 优先级 排序规则。
示例¶
此示例展示典型的 CASE
用法:
SELECT column1, CASE WHEN column1=1 THEN 'one' WHEN column1=2 THEN 'two' ELSE 'other' END AS result FROM (values(1),(2),(3)) v;输出:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | 3 | other | +---------+--------+
此示例表明,如果所有值都不匹配,并且没有 ELSE
子句,则返回的值为 NULL:
SELECT column1, CASE WHEN column1=1 THEN 'one' WHEN column1=2 THEN 'two' END AS result FROM (values(1),(2),(3)) v;输出:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | 3 | NULL | +---------+--------+
此示例显式处理 NULL。
SELECT column1, CASE WHEN column1 = 1 THEN 'one' WHEN column1 = 2 THEN 'two' WHEN column1 IS NULL THEN 'NULL' ELSE 'other' END AS result FROM VALUES (1), (2), (NULL);输出:
+---------+--------+ | COLUMN1 | RESULT | |---------+--------| | 1 | one | | 2 | two | | NULL | NULL | +---------+--------+
以下示例将 CASE
与排序规则结合使用:
SELECT CASE COLLATE('m', 'upper') WHEN 'M' THEN TRUE ELSE FALSE END; +----------------------------+ | CASE COLLATE('M', 'UPPER') | | WHEN 'M' THEN TRUE | | ELSE FALSE | | END | |----------------------------| | True | +----------------------------+ SELECT CASE 'm' WHEN COLLATE('M', 'lower') THEN TRUE ELSE FALSE END; +------------------------------------------+ | CASE 'M' | | WHEN COLLATE('M', 'LOWER') THEN TRUE | | ELSE FALSE | | END | |------------------------------------------| | True | +------------------------------------------+