16. 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_value是一个表达式,这个值与when_value相比较,如果相等,则进入相应的statement_list,statement_list就是一个语句列表,可以包含多条语句。如果在when_value中没有和case_value相等的值,则进入ELSE里面的statement_list语句列表。

对于第二个语法,每一个WHEN后面的search_condition表达式都会被判断,直到一个表达式的结果为真,然后执行相应的THEN后面的语句序列。如果没有匹配的,则执行ELSE后面的语句列表。

如果when_value或search_condition都没有匹配到相应的值,并且没有写ELSE的时候,会出现a Case not found for CASE statement error results错误。

每个statement_list应该包含一个或多个SQL语句,一个空的statement_list是不允许的。

要处理这种没有匹配,也不想在ELSE里写任何SQL语句的时候,可以在ELSE里写一个空的BEGIN … END 块,如下所示:

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