13.6.5.2 IF 语句
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
存储程序的IF语句实现基本的条件构造。
Note
还有一个IF() * function *,与这里描述的IF * statement *不同。参见第 12.4 节“控制流功能”。 IF语句可以包含THEN
,ELSE
和ELSEIF
子句,并以END IF
终止。
如果给定的* search_condition
计算结果为 true,则执行相应的THEN
或ELSEIF
子句 statement_list
。如果没有 search_condition
匹配,则执行ELSE
子句 statement_list
*。
每个* statement_list
由一个或多个 SQL 语句组成;不允许为空 statement_list
*。
就像存储程序中使用的所有其他流控制块一样,IF ... END IF
块必须以分号终止,如下例所示:
DELIMITER //
CREATE FUNCTION SimpleCompare(n INT, m INT)
RETURNS VARCHAR(20)
BEGIN
DECLARE s VARCHAR(20);
IF n > m THEN SET s = '>';
ELSEIF n = m THEN SET s = '=';
ELSE SET s = '<';
END IF;
SET s = CONCAT(n, ' ', s, ' ', m);
RETURN s;
END //
DELIMITER ;
与其他流控制构造一样,IF ... END IF
块可以嵌套在其他流控制构造中,包括其他IF语句。每个IF必须以自己的END IF
终止,后跟一个分号。您可以使用缩进使人类更容易阅读嵌套的流控制块(尽管 MySQL 不需要),如下所示:
DELIMITER //
CREATE FUNCTION VerboseCompare (n INT, m INT)
RETURNS VARCHAR(50)
BEGIN
DECLARE s VARCHAR(50);
IF n = m THEN SET s = 'equals';
ELSE
IF n > m THEN SET s = 'greater';
ELSE SET s = 'less';
END IF;
SET s = CONCAT('is ', s, ' than');
END IF;
SET s = CONCAT(n, ' ', s, ' ', m, '.');
RETURN s;
END //
DELIMITER ;
在此示例中,仅当n
不等于m
时才对内部IF求值。