【MySQL】FIND_IN_SET()とカスタム変数でカンマ区切りの値セットから値を検索する方法
カンマ区切りで並べた複数の値の中から特定の値を検索したい場合は、MySQLのFIND_IN_SET()関数を使用します。ユーザー定義変数(カスタム変数)に値のセットを格納しておけば、検索条件を柔軟に変更できるのも大きな魅力です。ここでは、実際の手順をサンプルコードとともに解説します。
サンプルテーブルの作成
まず、検索対象となるテーブルを作成しましょう。
mysql> create table DemoTable1411
-> (
-> Value int
-> )
->;
Query OK, 0 rows affected (0.50 sec)
レコードの挿入
次に、INSERT文を使ってテーブルにいくつかのレコードを追加します。
mysql> insert into DemoTable1411 values(10);
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable1411 values(50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1411 values(60);
Query OK, 1 row affected (0.08 sec)
登録内容の確認
SELECT文ですべてのレコードを表示してみます。
mysql> select * from DemoTable1411;
上記のクエリを実行すると、次のような結果が得られます。
+-------+
| Value |
+-------+
| 10 |
| 50 |
| 60 |
+-------+
3 rows in set (0.00 sec)
カスタム変数とFIND_IN_SET()で値を検索する
続いて、複数の値のセットの中から該当する値を検索するクエリを紹介します。まずSET文でカスタム変数にカンマ区切りの値を設定し、その変数をFIND_IN_SET()関数に渡して検索を行います。
mysql> set @setOfValues:='70,50,100';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from DemoTable1411
-> where find_in_set(Value,@setOfValues);
実行すると、次のような出力が得られます。
+-------+
| Value |
+-------+
| 50 |
+-------+
1 row in set (0.00 sec)
仕組みの解説
FIND_IN_SET(値, 文字列)は、第2引数に指定したカンマ区切りの文字列の中に第1引数の値が含まれているかどうかを調べる関数です。値が見つかった場合はその位置(1始まり)を返し、見つからない場合は0を返します。WHERE句ではこの結果が真(0以外)となる行だけが抽出されるため、今回の例では「70,50,100」という値のセットに含まれるレコード、すなわち「50」のみが取得されました。
このようにカスタム変数を組み合わせれば、検索対象の値リストを実行時に動的に切り替えられるため、アプリケーションからの条件指定にも活用しやすいテクニックです。
-
MySQLである列の値を取得し、カンマ区切りの値を持つ別の列内での位置を見つけるクエリの書き方
ある列の値が、カンマ区切りの値を格納した別の列の中で何番目に存在するかを調べたい場合には、FIND_IN_SET() 関数を使用します。この記事では、実際にテーブルを作成し、サンプルデータを使って具体的な手順を解説します。 1. テーブルの作成 まず、サンプル用のテーブルを作成します。 mysql> create table DemoTable1866 ( Value1 int, ListOfValues varchar(100) &nbs
-
MySQLのSELECT文をカスタム変数に設定する方法
この記事では、MySQLでSELECT文(クエリ)の結果をカスタム変数(ユーザー定義変数)に設定する方法を解説します。まずサンプル用のテーブルを作成してデータを挿入し、その後SET句と「@」から始まる変数を使ってクエリを変数に格納する手順を、実際の実行例とともに見ていきましょう。 1. テーブルを作成する 最初に、以下のコマンドでテーブルを作成します。 mysql> create table DemoTable2013 -> ( -> Name varchar(20)