MySQLでやりたいことから調べられるリファレンス

MySQL 逆引きリファレンス

条件分岐(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>
スポンサードリンク

ストアドプロシージャ

ストアドファンクション

その他のカテゴリー一覧