IFsearch_condition
THENstatement_list
[ELSEIFsearch_condition
THENstatement_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
に等しくない場合にのみ評価されます。