13.6.5.1 CASE 声明

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

Or:

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

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

Note

还有一个CASE * expr *,与这里描述的CASE 语句不同。参见第 12.4 节“控制流功能”CASE语句不能包含ELSE NULL子句,并且以END CASE而不是END终止。

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

此语法不能用于测试与NULL的相等性,因为NULL = NULL为 false。参见第 3.3.4.6 节“使用 NULL 值”

对于第二种语法,将对每个WHEN子句* search_condition table 达式求值,直到一个 table 达式为真为止,然后执行其对应的THEN子句 statement_list 。如果没有 search_condition 相等,则执行ELSE子句 statement_list *(如果存在)。

如果没有* when_value search_condition *与测试的值匹配,并且CASE语句不包含ELSE子句,则找不到 CASE 语句错误的大小写。

每个* statement_list 由一个或多个 SQL 语句组成;不允许为空 statement_list *。

要处理任何WHEN子句不匹配任何值的情况,请使用包含空开始...结束块的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;
  |