MySQLでカンマ区切りのカラムから値を検索する方法【FIND_IN_SET関数】
MySQLでは、1つのカラムに「41,14,94」のようにカンマ区切りの複数の値が格納されていることがあります。このようなカラムから特定の値を検索したい場合は、FIND_IN_SET() 関数を使用するのが便利です。
この記事では、実際にテーブルを作成し、FIND_IN_SET() を使ってカンマ区切りのデータを検索する手順を解説します。
サンプルテーブルの作成
まず、CREATE TABLE 文でテーブルを作成します。
mysql> create table DemoTable
-> (
-> Value varchar(20)
-> );
Query OK, 0 rows affected (0.47 sec)テストデータの挿入
次に、INSERT コマンドを使ってカンマ区切りの値を持つレコードを挿入します。
mysql> insert into DemoTable values('41,14,94');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable values('64,84,94');
Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable values('44,74,103,104');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable values('904,1004,1444,1544');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable values('4,144,174');
Query OK, 1 row affected (0.15 sec)登録済みレコードの確認
SELECT 文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、以下のような結果が出力されます。
+--------------------+ | Value | +--------------------+ | 41,14,94 | | 64,84,94 | | 44,74,103,104 | | 904,1004,1444,1544 | | 4,144,174 | +--------------------+ 5 rows in set (0.00 sec)
FIND_IN_SET() を使った検索クエリ
ここで本題です。カンマ区切りのカラムから特定の値を検索するには、WHERE 句の中で FIND_IN_SET() を使用します。以下は、値「4」を含むレコードを検索するクエリの例です。
mysql> select *from DemoTable where find_in_set('4',Value);実行結果は以下のとおりです。
+-----------+ | Value | +-----------+ | 4,144,174 | +-----------+ 1 row in set (0.00 sec)
FIND_IN_SET() のポイント
FIND_IN_SET(検索値, 対象文字列) は、対象文字列をカンマで分割したリストの中に検索値が存在すれば、その位置(1始まり)を返し、存在しなければ 0 を返します。
このため、「4」で検索した場合、「41」や「144」といった部分一致の値はマッチせず、リスト内の要素として完全に一致する「4」だけがヒットします。LIKE '%4%' のような曖昧な検索と違い、意図しない誤マッチを防げるのが大きなメリットです。
なお、大量のデータに対して頻繁にこの種の検索を行う場合は、インデックスが効かずパフォーマンスが低下する可能性があります。そのようなケースでは、正規化して別テーブルに値を分割して保存することも検討しましょう。
-
MySQLですべての行の値をカンマ区切りの単一の行として表示する方法
GROUP_CONCAT()とCONCAT()を使って複数行の値を1行にまとめる方法MySQLでテーブル内の複数の行に格納された値を、カンマ(コンマ)で区切られた単一の行として取得したい場合には、GROUP_CONCAT()関数とCONCAT()関数を組み合わせて使用します。GROUP_CONCAT()はグループ内の複数の値を連結して文字列として返し、CONCAT()を使うことで各値の前後に任意の文字を追加できます。以下では、実際の手順をサンプルコードとともに順番に解説していきます。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここではint型の「Id」カラムを持つシン
-
MySQLで予約語「from」を列名として使用する方法
MySQLで「from」を列名として使うには? MySQLでは「from」は予約語(リザーブドワード)として登録されているため、そのまま列名として使用するとエラーが発生します。しかし、バッククォート(`` ` ``)で囲むことで、予約語である「from」を列名として扱うことができます。 この記事では、実際にテーブルを作成し、「from」を列名としてデータの挿入や取得を行う手順を解説します。 1. バッククォートを使ってテーブルを作成する まず、列名「from」をバッククォートで囲んでテーブルを作成します。以下のSQLを実行してください。 mysql> create table Demo