文档主页
MySQL 9.0 参考手册
相关文档 下载此手册

15.6.5.2 IF 语句

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

用于存储程序的 IF 语句实现了一个基本的条件构造。

注意

还有一个 IF() 函数,它与这里描述的 IF 语句 不同。参见 第 14.5 节,“流控制函数”IF 语句可以包含 THENELSEELSEIF 子句,并以 END IF 结束。

如果给定的 search_condition 评估为真,则执行相应的 THENELSEIF 子句 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 时才会被执行。