Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

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 语句实现了复杂的条件构造。

Note

还有一个 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 是 false。见 第 5.3.4.6 节,“处理 NULL 值”

对于第二种语法,每个 WHEN 子句 search_condition 表达式将被评估,直到找到一个为 true 的值,然后执行相应的 THEN 子句 statement_list。如果没有找到相等的 search_condition,则 ELSE 子句 statement_list 将执行,如果存在的话。

如果没有 when_valuesearch_condition 匹配测试的值,并且 CASE 语句不包含 ELSE 子句,则将出现 CASE 语句找不到匹配值 错误。

每个 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;
  |