CASE 表达式

CASE 表达式允许根据一个或多个条件的求值来选择表达式。

case-expression
Read syntax diagramSkip visual syntax diagramCASEsearched-when-clausesimple-when-clauseELSE NULLELSEresult-expressionEND1
searched-when-clause
Read syntax diagramSkip visual syntax diagramWHENsearch-conditionTHENresult-expressionNULL
simple-when-clause
Read syntax diagramSkip visual syntax diagramexpression WHENexpressionTHENresult-expressionNULL
Notes:
  • 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 或这些函数的等效表达式。

表 1. 等效 CASE 表达式
表达式 等效表达式
CASE
  WHEN e1=e2 THEN NULL
  ELSE e1
END
NULLIF (e1,e2)
CASE
  WHEN e1 IS NOT NULL THEN e1
  ELSE e2
END
COALESCE (e1,e2)
CASE
  WHEN e1 IS NOT NULL THEN e1
  ELSE COALESCE(e2,...,eN)
END
COALESCE (e1,e2,...,eN)
CASE
  WHEN c1=var1 OR (c1 IS NULL AND var1 IS NULL)
    THEN 'a'
  WHEN c1=var2 OR (c1 IS NULL AND var2 IS NULL)
    THEN 'b'
  ELSE NULL
END
DECODE (c1,var1, 'a ', var2, 'b')