文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
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 陳述式實作了基本的條件結構。

注意

還有一個 IF() 函式,它與此處描述的 IF 陳述式 不同。請參閱 第 14.5 節,「流程控制函式」IF 陳述式可以有 THENELSEELSEIF 子句,並以 END IF 終止。

如果給定的 search_condition 評估為 true,則會執行對應的 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 ;

在本範例中,只有在 n 不等於 m 時才會評估內部的 IF