MySQL 支持 IF、CASE、ITERATE、LEAVE LOOP、WHILE 和 REPEAT 结构,用于存储程序中的流程控制。它还支持存储函数内的 RETURN 关键字。这些结构中有许多包含其他语句,如以下部分中的语法规范所示。这样的构造可以嵌套。例如,IF 语句可能包含 WHILE 循环,而 WHILE 循环本身包含 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;
|
https://dev.mysql.com/doc/refman/8.0/en/flow-control-statements.htmlhttps://dev.mysql.com/doc/refman/8.0/en/case.html