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

MySQLでカンマ区切りの値を持つ列から特定のレコードを検索する方法

MySQLでは、カンマ区切りで複数の値が格納された列から特定の値を含むレコードを抽出したいケースがあります。そんなときに便利なのが FIND_IN_SET() 関数です。この関数を使うと、カンマ区切りの文字列の中に指定した値が存在するかどうかを簡単に判定できます。

この記事では、実際にテーブルを作成し、FIND_IN_SET() を使って特定のレコードを検索する手順を解説します。

1. テーブルの作成

まず、カンマ区切りの値を格納するためのテーブルを作成します。

mysql> create table DemoTable
-> (
-> ListOfValue varchar(20)
-> );
Query OK, 0 rows affected (0.52 sec)

2. レコードの挿入

次に、INSERT文を使ってサンプルデータを登録します。各レコードにはカンマ区切りの数値リストを格納します。

mysql> insert into DemoTable values('78,89,65');
Query OK, 1 row affected (0.12 sec)
mysql> insert into DemoTable values('88,96,97');
Query OK, 1 row affected (0.30 sec)
mysql> insert into DemoTable values('95,96,99,100');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable values('78,45,67,98');
Query OK, 1 row affected (0.10 sec)

3. 登録データの確認

SELECT文ですべてのレコードを表示して、データが正しく登録されているか確認しましょう。

mysql> select * from DemoTable;

実行結果は以下の通りです。

+--------------+
| ListOfValue |
+--------------+
| 78,89,65 |
| 88,96,97 |
| 95,96,99,100 |
| 78,45,67,98 |
+--------------+
4 rows in set (0.00 sec)

4. FIND_IN_SET() を使ったレコードの検索

ここからが本題です。FIND_IN_SET() 関数を使えば、カンマ区切りの値の中に特定の値が含まれているレコードだけを抽出できます。

以下のクエリでは、「89」または「99」を含むレコードを検索しています。

mysql> select * from DemoTable
-> where find_in_set('89',ListOfValue)
-> or
-> find_in_set('99',ListOfValue);

実行結果は以下の通りです。

+--------------+
| ListOfValue |
+--------------+
| 78,89,65 |
| 95,96,99,100 |
+--------------+
2 rows in set (0.00 sec)

FIND_IN_SET() のポイント

FIND_IN_SET(検索値, 対象列) の形式で使用し、対象列のカンマ区切りリスト内に検索値が存在すればその位置(1始まり)を返し、存在しなければ 0 を返します。WHERE句と組み合わせることで、上記のように条件に一致するレコードのみを取得できます。

なお、LIKE演算子による部分一致検索では「78」が「178」にも一致してしまうなどの誤検出が起こる可能性がありますが、FIND_IN_SET() はカンマ区切りの要素単位で完全一致判定を行うため、より正確な検索が可能です。

  1. MySQLで特定のカラム名を持つテーブルを検索する方法

    MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a

  2. MySQLである列の値を取得し、カンマ区切りの値を持つ別の列内での位置を見つけるクエリの書き方

    ある列の値が、カンマ区切りの値を格納した別の列の中で何番目に存在するかを調べたい場合には、FIND_IN_SET() 関数を使用します。この記事では、実際にテーブルを作成し、サンプルデータを使って具体的な手順を解説します。 1. テーブルの作成 まず、サンプル用のテーブルを作成します。 mysql> create table DemoTable1866      (      Value1 int,      ListOfValues varchar(100)     &nbs