文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


15.6.5.1 CASE 语句

CASE case_value
    WHEN when_value THEN statement_list
    [WHEN when_value THEN statement_list] ...
    [ELSE statement_list]
END CASE

或者

CASE
    WHEN search_condition THEN statement_list
    [WHEN search_condition THEN statement_list] ...
    [ELSE statement_list]
END CASE

用于存储程序的 CASE 语句实现了一种复杂的条件构造。

注意

还有一个 CASE 运算符,它与这里描述的 CASE 语句 不同。请参阅 第 14.5 节,“流程控制函数”CASE 语句不能包含 ELSE NULL 子句,并且以 END CASE 而不是 END 结尾。

对于第一个语法,case_value 是一个表达式。此值将与每个 WHEN 子句中的 when_value 表达式进行比较,直到找到相等的值。当找到相等的 when_value 时,将执行相应的 THEN 子句 statement_list。如果找不到相等的 when_value,则将执行 ELSE 子句 statement_list(如果有)。

此语法无法用于测试与 NULL 的相等性,因为 NULL = NULL 为假。请参阅 第 5.3.4.6 节,“使用 NULL 值”

对于第二种语法,每个 WHEN 子句 search_condition 表达式都会被评估,直到有一个表达式为真,此时其对应的 THEN 子句 statement_list 会被执行。如果所有 search_condition 都为假,则会执行 ELSE 子句 statement_list(如果有)。

如果没有任何 when_valuesearch_condition 与测试值匹配,且 CASE 语句不包含 ELSE 子句,则会产生 Case not found for CASE statement 错误。

每个 statement_list 包含一个或多个 SQL 语句;不允许出现空 statement_list

为了处理没有任何值与 WHEN 子句匹配的情况,请使用包含空 BEGIN ... END 块的 ELSE,如以下示例所示。(此处在 ELSE 子句中使用的缩进仅用于提高清晰度,没有其他意义。)

DELIMITER |

CREATE PROCEDURE p()
  BEGIN
    DECLARE v INT DEFAULT 1;

    CASE v
      WHEN 2 THEN SELECT v;
      WHEN 3 THEN SELECT 0;
      ELSE
        BEGIN
        END;
    END CASE;
  END;
  |