MySQLストアドプロシージャでCASEステートメントを使う方法を徹底解説
MySQLのCASEステートメントとは
MySQLにおけるCASEステートメントは、IF-THEN-ELSEステートメントと同等の機能を持つ条件分岐構文です。複数の条件を上から順に評価し、最初にTRUEと評価された条件に対応する処理ブロックを実行します。ストアドプロシージャやストアドファンクションの中で使うことで、柔軟なロジックを記述できます。
基本構文
CASE
WHEN condition_1 THEN
{...condition_1がTRUEの場合に実行する処理...}
[ WHEN condition_2 THEN
{...condition_2がTRUEの場合に実行する処理...} ]
[ WHEN condition_n THEN
{...condition_nがTRUEの場合に実行する処理...} ]
[ ELSE
{...すべての条件がFALSEだった場合に実行する処理...} ]
END CASE;どのWHEN句の条件もTRUEにならなかった場合、CASEステートメントはELSE句を実行します。なお、ELSE句を省略して一致する条件が存在しなかった場合、MySQLは「Case not found for CASE statement」というエラーを返すため、想定外の値に備えてELSE句を記述しておくのが安全です。
サンプルデータの準備
ここでは、次のような「student_info」テーブルを例にして、CASEステートメントの使い方を解説します。
mysql> Select * from student_info; +------+---------+------------+------------+ | id | Name | Address | Subject | +------+---------+------------+------------+ | 101 | YashPal | Amritsar | History | | 105 | Gaurav | Jaipur | Literature | | 125 | Raman | Shimla | Computers | +------+---------+------------+------------+ 3 rows in set (0.00 sec)
CASEステートメントを含むストアドプロシージャの作成
次のクエリは、CASEステートメントを含む「coursedetails_CASE」という名前のストアドプロシージャを作成します。INパラメータとして科目名(S_subject)を受け取り、その科目に対応するコース名をOUTパラメータ(S_Course)として返します。
mysql> Delimiter // mysql> CREATE PROCEDURE coursedetails_CASE(IN S_subject Varchar(20), OUT S_Course Varchar(50)) -> BEGIN -> DECLARE SUB VArchar(20); -> SELECT SUBJECT INTO Sub -> FROM Student_Info WHERE S_Subject = Subject; -> CASE S_Subject WHEN 'Computers' THEN -> SET S_Course = 'B.Tech(CSE)’; -> WHEN 'History' THEN -> SET S_Course = 'Masters in History'; -> WHEN 'Literature' THEN -> SET S_Course = 'Masters in English'; -> ELSE -> SET S_Course = 'Subject not in the table'; -> END CASE ; -> END // Query OK, 0 rows affected (0.11 sec)
このプロシージャの流れは以下のとおりです。
まず、SELECT ... INTOを使って指定された科目がstudent_infoテーブルに存在するかどうかを確認します。その後、CASEステートメントで科目名を判定し、対応するコース名をOUTパラメータにセットしています。テーブルに存在しない科目が渡された場合は、ELSE句が実行され、「Subject not in the table」というメッセージが返されます。
なお、先頭のDelimiter //は、プロシージャ本体に含まれるセミコロン(;)をMySQLクライアントが文の区切りと誤認識しないための一時的な区切り文字変更です。定義が完了したらDELIMITER ;で元に戻しておきましょう。
プロシージャの実行結果
作成したプロシージャをCALL文で呼び出すと、次のような結果が得られます。
mysql> DELIMITER ;
mysql> CALL coursedetails_CASE ('Computers', @S_course);
Query OK, 1 row affected (0.08 sec)
mysql> Select @S_Course;
+-------------+
| @S_Course |
+-------------+
| B.Tech(CSE) |
+-------------+
1 row in set (0.00 sec)
mysql> CALL coursedetails_CASE ('literature', @S_course);
Query OK, 1 row affected (0.00 sec)
mysql> Select @S_Course;
+--------------------+
| @S_Course |
+--------------------+
| Masters in English |
+--------------------+
1 row in set (0.00 sec)
mysql> CALL coursedetails_CASE ('Math', @S_course);
Query OK, 0 rows affected (0.00 sec)
mysql> Select @S_Course;
+--------------------------------+
| @S_Course |
+--------------------------------+
| Subject Not in the table |
+--------------------------------+
1 row in set (0.00 sec)
mysql> CALL coursedetails_CASE ('History', @S_course);
Query OK, 1 row affected (0.01 sec)
mysql> Select @S_Course;
+--------------------+
| @S_Course |
+--------------------+
| Masters in History |
+--------------------+
1 row in set (0.00 sec)実行結果のポイント
- 'Computers' を渡すと、WHEN句に一致して「B.Tech(CSE)」が返されます。
- 'literature' のように小文字で渡しても、デフォルトの照合順序(大文字小文字を区別しない設定)では「Literature」のWHEN句に一致し、「Masters in English」が返されます。
- 'Math' のようにテーブルにもCASEの条件にも存在しない科目を渡すと、ELSE句が実行され「Subject Not in the table」が返されます。
- 'History' を渡すと「Masters in History」が返されます。
このように、CASEステートメントを使えば、ストアドプロシージャ内で入力値に応じた複数の処理を簡潔に切り替えることができます。IFステートメントを入れ子にするよりも可読性が高くなるため、条件分岐が多くなるケースではCASEステートメントの活用をおすすめします。
-
MySQLストアドプロシージャ内で別のストアドプロシージャを呼び出す方法
MySQLのストアドプロシージャは、その内部で別のストアドプロシージャを呼び出すことが可能です。これはCALLステートメントを使用することで実現でき、処理をモジュール化して再利用性を高める上で非常に便利な機能です。ここでは、あるストアドプロシージャが別のストアドプロシージャを呼び出し、last_insert_id()を取得する具体例を見ていきましょう。サンプルテーブルの作成まず、例として使用するテーブルを作成します。以下のテーブルは、自動採番されるIDと名前を持つ従業員テーブルです。mysql> CREATE TABLE employee.tbl(Id INT NOT NULL AUTO
-
MySQLでSELECTステートメントを使ってストアドプロシージャを呼び出す方法
MySQLでは、FROM句の中でストアドプロシージャを直接指定してSELECTすることはできません。代わりにCALLコマンドを使ってプロシージャを呼び出し、その後でSELECTステートメントを実行して結果を確認する流れになります。この記事では、実際にテーブルとストアドプロシージャを作成し、CALLで呼び出してからSELECTでデータを取得するまでの手順を順番に解説します。1. サンプルテーブルを作成するまずはデータを格納するためのテーブルを作成しましょう。以下の例では、顧客ID・顧客名・出荷日時を持つテーブルを定義しています。mysql> create table DemoTable2