条件分岐(IF文)の書き方
スポンサードリンク
MySQL のストアドプロシージャとストアドファンクションでは、条件分岐に IF と CASE が使用できます。このページでは、 IF の使い方について説明します。
IF 文の書式は次の通りです。ELSEIF については必要な分だけ追加することができます。ELSE はなくても動作しますが、想定しないケースへの対処が漏れることがあるので必ずつけていた方が良いです。また END IF の後ろにはセミコロン(;)が必要です。
書式
IF 条件式 THEN 実行する処理 ELSEIF 条件式 THEN 実行する処理 ELSE 実行する処理 END IF;
条件式には WHERE 句と同じように等号、不等号や BETWEEN が使用可能です。
サンプルコード(条件式に不等号)
DELIMITER // CREATE PROCEDURE testproc(IN prmIn INT) BEGIN IF prmIn > 2 THEN SELECT '2より大きい'; ELSEIF prmIn = 2 THEN SELECT 'ちょうど2'; ELSEIF prmIn < 2 THEN SELECT '2より小さい'; ELSE SELECT '予期しない値'; END IF; END // DELIMITER ;
IF から実行する処理までを1行にまとめても正しく処理できるので、その方が見やすい場合は次のように記述した方が良いです。
サンプルコード(条件式に不等号)
DELIMITER // CREATE PROCEDURE testproc(IN prmIn INT) BEGIN IF prmIn > 2 THEN SELECT '2より大きい'; ELSEIF prmIn = 2 THEN SELECT 'ちょうど2'; ELSEIF prmIn < 2 THEN SELECT '2より小さい'; ELSE SELECT '予期しない値'; END IF; END // DELIMITER ;
上記の実行結果は次の通りです。
mysql> CALL TESTPROC(1); +-------------+ | 2より小さい | +-------------+ | 2より小さい | +-------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> CALL TESTPROC(2); +-----------+ | ちょうど2 | +-----------+ | ちょうど2 | +-----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> CALL TESTPROC(3); +-------------+ | 2より大きい | +-------------+ | 2より大きい | +-------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql>
次は条件式に BETWEEN を使用する例です。
DELIMITER // CREATE PROCEDURE testproc(IN prmIn INT) BEGIN IF prmIn BETWEEN 0 AND 10 THEN SELECT '0から10の間'; ELSEIF prmIn BETWEEN 11 AND 20 THEN SELECT '11から20の間'; ELSEIF prmIn BETWEEN 21 AND 30 THEN SELECT '21から30の間'; ELSE SELECT '予期しない値'; END IF; END // DELIMITER ;
上記の実行結果は次の通りです。
mysql> CALL TESTPROC(11); +--------------+ | 11から20の間 | +--------------+ | 11から20の間 | +--------------+ 1 row in set (0.44 sec) Query OK, 0 rows affected (0.45 sec) mysql> CALL TESTPROC(22); +--------------+ | 21から30の間 | +--------------+ | 21から30の間 | +--------------+ 1 row in set (0.07 sec) Query OK, 0 rows affected (0.07 sec) mysql> CALL TESTPROC(33); +--------------+ | 予期しない値 | +--------------+ | 予期しない値 | +--------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql>
IF 文の条件式には SQL を含めることもできます。次の例では、TEST1 テーブルの件数をカウントし、その結果を引数と比較して処理を分岐しています。
DELIMITER // CREATE PROCEDURE testproc(IN prmIn INT) BEGIN IF (SELECT COUNT(*) FROM TEST1) = prmIn THEN SELECT 'あたり!'; ELSEIF (SELECT COUNT(*) FROM TEST1) > prmIn THEN SELECT '少ない'; ELSEIF (SELECT COUNT(*) FROM TEST1) < prmIn THEN SELECT '多い'; ELSE SELECT '不明'; END IF; END // DELIMITER ;
上記の実行結果は次の通りです。今回は予め 4 件のデータを TEST1 テーブルに登録しておきました。
mysql> CALL TESTPROC(3); +--------+ | 少ない | +--------+ | 少ない | +--------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.00 sec) mysql> CALL TESTPROC(4); +----------+ | あたり! | +----------+ | あたり! | +----------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec) mysql> CALL TESTPROC(5); +------+ | 多い | +------+ | 多い | +------+ 1 row in set (0.03 sec) Query OK, 0 rows affected (0.04 sec) mysql>
スポンサードリンク