IFsearch_conditionTHENstatement_list[ELSEIFsearch_conditionTHENstatement_list] ... [ELSEstatement_list] END IF
IF
は基本条件構造構文を施行します。search_condition
が真の場合、該当する SQL
ステートメントが実行されます。search_condition
が合致しない場合、ELSE
節内のステートメントリストが実行されます。各
statement_list
は複数のステートメントから成り立っています。
また、ここで説明している
IF
ステートメントとは異なる
IF()
関数もあります。項7.3. 「制御フロー関数」
を参照してください。
次の例に示すように、ストアドプログラム内で使用されるほかのすべてのフロー制御ブロックと同じく、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
に等しくない場合にのみ評価されます。
