MySQL 8.4 Release Notes
15.6.5.2 IF 语句
IF search_condition THEN statement_list
[ELSEIF search_condition THEN statement_list] ...
[ELSE statement_list]
END IF
存储程序中的IF
语句实现基本的条件构造。
Note
此外,还有一个IF()
函数,它与在这里描述的IF
语句不同。请参阅第14.5节,“流控制函数”。IF
语句可以具有THEN
、ELSE
和ELSEIF
子句,并且以END IF
终止。
如果给定的search_condition
评估为真,则对应的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 ;
在这个例子中,内层IF
只有在n
不等于 m
时被评估。