流控制语句

 MySQL 支持 IFCASEITERATELEAVE LOOPWHILE 和 REPEAT 结构,用于存储程序中的流程控制。它还支持存储函数内的 RETURN 关键字。 这些结构中有许多包含其他语句,如以下部分中的语法规范所示。这样的构造可以嵌套。例如,IF 语句可能包含 WHILE 循环,而 WHILE 循环本身包含 CASE 语句。 MySQL不支持 FOR 循环。 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 语句不同。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 对于第二种语法,每个 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 子句都不匹配的情况,请使用 ELSE 包含空的 BEGIN ... END 块,如本例所示。(在 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;  |