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_value
或 search_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;
|