#### 13.6.5.2 IF 语句

[](<>)

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

这[`如果`](if.html)存储程序的语句实现了一个基本的条件结构。

笔记

还有一个[`如果（）`](flow-control-functions.html#function_if) *功能*, 这不同于[`如果`](if.html) *陈述*描述here。看[第 12.5 节，“流控制功能”](flow-control-functions.html).这[`如果`](if.html)声明可以有`然后`,`别的`， 和`埃尔塞夫`子句，并以`万一`.

如果给定*`搜索条件`*评估为真，对应的`然后`要么`埃尔塞夫`条款*`声明列表`*执行。如果不*`搜索条件`*火柴`别的`条款*`声明列表`*执行。

每个*`声明列表`*由一条或多条 SQL 语句组成；一个空的*`声明列表`*不允许。

一个`如果...结束如果`与存储程序中使用的所有其他流控制块一样，块必须以分号结尾，如下例所示：

```
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.html)陈述。每个[`如果`](if.html)必须由自己终止`万一`后跟一个分号。您可以使用缩进使嵌套的流控制块更容易被人类阅读（尽管 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.html)仅在以下情况下进行评估`n`不等于`米`.
