MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLストアドプロシージャでWHERE IN()を使う方法

MySQLのストアドプロシージャ内でWHERE IN()句を動的に扱いたい場面は多くあります。本記事では、実際にテーブルを作成し、ストアドプロシージャを定義して、IN()条件に複数の値を渡して実行するまでの手順を解説します。

1. サンプルテーブルの作成

まず、以下のコマンドでテーブルを作成します。

mysql> create table DemoTable
-> (
-> Id int,
-> Name varchar(20)
-> );
Query OK, 0 rows affected (0.69 sec)

2. レコードの挿入

INSERTコマンドを使って、いくつかのレコードをテーブルに挿入します。

mysql> insert into DemoTable values(100,'Chris');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values(101,'Bob');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values(102,'David');
Query OK, 1 row affected (0.18 sec)

3. データの確認

SELECT文でテーブル内の全レコードを表示してみましょう。

mysql> select * from DemoTable;

実行すると、次のような結果が得られます。

+------+-------+
| Id | Name |
+------+-------+
| 100 | Chris |
| 101 | Bob |
| 102 | David |
+------+-------+
3 rows in set (0.00 sec)

4. WHERE IN()を使うストアドプロシージャの作成

ここからが本題です。WHERE IN()を使用するストアドプロシージャを作成するクエリは以下の通りです。

mysql> DELIMITER //
mysql> CREATE PROCEDURE whereInDemo(in input varchar(100))
-> BEGIN
-> set @Query = 'select Name from DemoTable ';
-> set @Query = CONCAT(@Query,' where Id IN (',`input`,')');
-> prepare stmt from @Query;
-> execute stmt;
-> deallocate prepare stmt;
-> END //
Query OK, 0 rows affected (0.23 sec)
mysql> DELIMITER ;

このプロシージャのポイントは、引数として受け取った値(例:'100,102')を文字列としてSQL文に連結し、PREPARE/EXECUTEによるプリペアドステートメントとして動的に実行している点です。これにより、呼び出しごとに異なるIDのリストを柔軟に指定できます。

5. ストアドプロシージャの実行

作成したプロシージャは、CALLコマンドで呼び出せます。

mysql> call whereInDemo('100,102');

実行すると、次のような結果が出力されます。

+-------+
| Name |
+-------+
| Chris |
| David |
+-------+
2 rows in set (0.04 sec)
Query OK, 0 rows affected, 1 warning (0.07 sec)

まとめ

このように、ストアドプロシージャ内でクエリ文字列を組み立ててプリペアドステートメントとして実行することで、WHERE IN()に可変数の値を渡すことが可能になります。IDの一覧など、実行時に条件が変わるケースで非常に便利な手法です。ただし、動的SQLではSQLインジェクションに注意が必要です。外部からの入力値をそのまま連結する場合は、事前に値の検証やサニタイズを行うことをおすすめします。

  1. MySQLのストアドプロシージャで特定の条件に一致するレコードを更新する方法

    MySQLでは、ストアドプロシージャ内でUPDATE文とWHERE句を組み合わせることで、特定の条件に一致するレコードだけを効率的に更新できます。本記事では、実際の手順をサンプルコードとともに段階的に解説します。 1. サンプルテーブルを作成する まず、デモ用のテーブル「DemoTable」を作成します。 mysql> create table DemoTable -> ( -> Id int, -> FirstName varchar(20), -> LastName varchar(20) -> ); Query

  2. MySQLでAUTO_INCREMENT列を扱う方法を徹底解説

    MySQLでは、AUTO_INCREMENT属性を使うことで、新しい行に対して自動的に一意の番号(識別子)を割り当てることができます。本記事では、AUTO_INCREMENT列の基本的な使い方、動作の仕組み、そして利用時に守るべきルールについて、実例とともにわかりやすく解説します。基本的な使い方まずは、以下のクエリを見てみましょう。テーブルを作成し、データを挿入した結果を確認します。クエリ例CREATE TABLE tableName (    id MEDIUMINT NOT NULL AUTO_INCREMENT,