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
是 false。见 第 5.3.4.6 节,“处理 NULL 值”。
对于第二种语法,每个 WHEN
子句 search_condition
表达式将被评估,直到找到一个为 true 的值,然后执行相应的 THEN
子句 statement_list
。如果没有找到相等的 search_condition
,则 ELSE
子句 statement_list
将执行,如果存在的话。
如果没有 when_value
或 search_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;
|