CASE
CASE 语句用于构造复杂的条件语句。
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 语句不能有 ELSE NULL 子句,它以 END CASE 终止。
对于第一种语法,case_value 为表达式,它与每个 WHEN 子句中的 when_value 表达式进行比较,直至出现与之相等的结果。当找到与 when_value 相等的值时,将执行相应的 THEN 子句中的 statement_list 语句。如果没有值与 when_value 值相等,则执行 ELSE 子句中的 statement_list 语句(如果有)。此语法不能用于测试与 NULL 的相等性,因为 NULL=NULL 为 False。
对于第二种语法,将对每个 WHEN 子句的 search_condition 表达式求值,直到其中一个表达式的结果为 True,这时将执行相 应的 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 子句,如下例所示。
DELIMITER //
CREATE PROCEDURE proc()
BEGIN
DECLARE x INT DEFAULT 1;
CASE x
WHEN 2 THEN SELECT x;
WHEN 3 THEN SELECT 0;
ELSE
BEGIN
END;
END CASE;
END //
Query OK, 0 rows affected