CASE 表达式
CASE 表达式允许根据一个或多个条件的求值来选择表达式。
- 1 If the result type of result-expression is a row type, then the syntax represents a row-case-expression and can only be used where a row-expression is allowed.
通常, case-expression 的值是求值为 true 的第一个 (最左侧) case 后面的 result-expression 的值。 如果没有任何观测值求值为 true 并且 ELSE 关键字存在,那么结果为 result-expression 或 NULL 的值。 如果没有观测值求值为 true ,并且 ELSE 关键字不存在,那么结果为 NULL。 请注意,当观测值求值为未知 (因为 NULL) 时,该观测值不为 true ,因此将以与求值为 false 的观测值相同的方式进行处理。
如果 CASE 表达式位于 VALUES 子句, IN 谓词, GROUP BY 子句或 ORDER BY 子句中,那么 search-when-子句 中的 search-condition 不能是量化谓词,使用全查询的 IN 谓词或 EXISTS 谓词 (SQLSTATE 42625)。
使用 simple-when-clause时,将测试第一个 WHEN 关键字之前的 expression 的值是否与 WHEN 关键字之后的 expression 的值相等。 因此,第一个 WHEN 关键字之前的 表达式 的数据类型必须与 WHEN 关键字之后的每个 表达式 的数据类型相当。 simple-when-clause 中第一个 WHEN 关键字之前的 表达式 不能包含 非确定性 函数或具有外部操作 (SQLSTATE 42845)。
result-expression 是跟随 THEN 或 ELSE 关键字的 表达式 。 CASE 表达式中必须至少有一个 result-expression (不能为每个个案指定 NULL) (SQLSTATE 42625)。 所有结果表达式都必须具有兼容的数据类型 (SQLSTATE 42804)。
示例
- 如果部门编号的第一个字符是组织中的部门,那么可以使用 CASE 表达式来列出每个员工所属的部门的全名:
SELECT EMPNO, LASTNAME, CASE SUBSTR(WORKDEPT,1,1) WHEN 'A' THEN 'Administration' WHEN 'B' THEN 'Human Resources' WHEN 'C' THEN 'Accounting' WHEN 'D' THEN 'Design' WHEN 'E' THEN 'Operations' END FROM EMPLOYEE; - 在 EMPLOYEE 表中使用教育年限来给出教育水平。 CASE 表达式可用于对这些内容进行分组并显示教育程度。
SELECT EMPNO, FIRSTNME, MIDINIT, LASTNAME, CASE WHEN EDLEVEL < 15 THEN 'SECONDARY' WHEN EDLEVEL < 19 THEN 'COLLEGE' ELSE 'POST GRADUATE' END FROM EMPLOYEE - CASE 语句用法的另一个有趣示例是防止被 0 错误分割。 例如,以下代码会查找收入超过佣金收入 25% 但未全额支付佣金的员工:
SELECT EMPNO, WORKDEPT, SALARY+COMM FROM EMPLOYEE WHERE (CASE WHEN SALARY=0 THEN NULL ELSE COMM/SALARY END) > 0.25; - 以下 CASE 表达式相同:
SELECT LASTNAME, CASE WHEN LASTNAME = 'Haas' THEN 'President' ... SELECT LASTNAME, CASE LASTNAME WHEN 'Haas' THEN 'President' ...
有两个标量函数 (NULLIF 和 COALESCE) 专门用于处理 CASE提供的功能子集。 表 1 显示了使用 CASE 或这些函数的等效表达式。
| 表达式 | 等效表达式 |
|---|---|
|
NULLIF (e1,e2) |
|
COALESCE (e1,e2) |
|
COALESCE (e1,e2,...,eN) |
|
DECODE (c1,var1, 'a ', var2, 'b') |
