类别:

条件表达式函数

CASE

工作方式类似于级联的“if-then-else”语句。在更常规的形式中,按顺序计算一系列条件。当某条件的计算结果为 TRUE 时,计算停止并返回关联的结果( THEN 之后)。如果所有条件的评估结果都不是 TRUE,则返回可选 ELSE 之后的结果(如果存在);否则返回 NULL。

在第二种“简写”形式中,CASE 之后的表达式与每个 WHEN 表达式按顺序进行比较,直到有一个表达式匹配为止;然后返回关联的结果( THEN 之后)。如果所有表达式都不匹配,则返回可选 ELSE 之后的结果(如果存在);否则返回 NULL。

请注意,在第二种形式中,NULL CASE 表达式不匹配任何 WHEN 表达式,即使其中一个 WHEN 表达式也是 NULL。

另请参阅:

IFF

语法

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
Copy

实参

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。如果有多个 valueexpr 匹配,则返回第一个匹配值的 result

结果应为计算结果为单个值的表达式。

在两种形式的 CASE 中,如果存在可选 ELSE 子句,并且未找到匹配项,则函数返回 ELSE 子句中的结果。如果不存在 ELSE 子句,并且未找到匹配项,则结果为 NULL。

使用说明

  • 请注意,与 DECODE 相反,条件中的 NULL 值 匹配条件中其他位置的 NULL 值。例如,WHEN <null_expr> = NULL THEN 'Return me!' 不返回“Return me!”。如果您要与 NULL 值进行比较,请使用 IS NULL,而不是 = NULL

  • condition#exprvalueresult 都可以是一般表达式,因此可以包含具有集合运算符的子查询,例如 UNIONINTERSECTEXCEPTMINUS。使用集合运算符时,请确保数据类型兼容。有关详细信息,请参阅 集运算符 主题中的 一般使用说明

排序规则详细信息

在第一种形式的 CASE 中,每个表达式都独立,不同分支中的排序规则规范也独立。例如,在以下语句中,condition1 中的排序规则规范与 condition2 中的排序规则规范无关,并且这些排序规则规范不需要相同甚至兼容。

CASE
    WHEN <condition1> THEN <result1>
  [ WHEN <condition2> THEN <result2> ]
Copy

在第二种形式的 CASE 中,尽管所有与排序规则相关的操作都必须使用兼容的排序规则规范,但排序规则规范不必完全相同。例如,在下面的语句中,value1value2 的排序规则规范必须与 expr 的排序规则规范兼容,但 value1value2 的排序规则规范不需要彼此相同,也不需要与 expr 的排序规则规范相同。

CASE <expr>
    WHEN <value1> THEN <result1>
  [ WHEN <value2> THEN <result2> ]
  ...
Copy

函数返回的值在 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;
Copy

输出:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | other  |
+---------+--------+
Copy

此示例表明,如果所有值都不匹配,并且没有 ELSE 子句,则返回的值为 NULL:

SELECT
    column1,
    CASE
        WHEN column1=1 THEN 'one'
        WHEN column1=2 THEN 'two'
    END AS result
FROM (values(1),(2),(3)) v;
Copy

输出:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|       3 | NULL   |
+---------+--------+
Copy

此示例显式处理 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);
Copy

输出:

+---------+--------+
| COLUMN1 | RESULT |
|---------+--------|
|       1 | one    |
|       2 | two    |
|    NULL | NULL   |
+---------+--------+
Copy

以下示例将 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                                     |
+------------------------------------------+
Copy
语言: 中文