Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


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语句可以具有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 时被评估。