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

【MySQL】カンマ区切りのリストから特定の文字列を検索するには?find_in_set()の使い方を解説

カンマ区切りのデータ検索には正規表現よりfind_in_set()が便利

MySQLでカンマ区切りのリスト(CSV形式のカラム)から特定の値を検索したい場合、正規表現を使わなくても、find_in_set() 関数を使うことで簡単に実現できます。find_in_set()は、カンマ区切りの文字列リストの中に指定した値が含まれているかどうかを判定してくれる便利な関数です。

基本構文

select *from テーブル名 where find_in_set(検索したい値, カラム名);

それでは、実際にサンプルテーブルを作成しながら動作を確認していきましょう。

サンプルテーブルの作成

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

mysql> create table demo17
-> (
-> id int not null auto_increment primary key,
-> first_name varchar(50),
-> value text
-> );
Query OK, 0 rows affected (1.81 sec)

テストデータの挿入

次に、insertコマンドを使ってレコードを挿入します。valueカラムにはカンマ区切りの複数の値を持つデータも含めてみましょう。

mysql> insert into demo17(first_name,value) values('John','50');
Query OK, 1 row affected (0.11 sec)

mysql> insert into demo17(first_name,value) values('David','');
Query OK, 1 row affected (0.13 sec)

mysql> insert into demo17(first_name,value) values('Adam','50,89');
Query OK, 1 row affected (0.14 sec)

mysql> insert into demo17(first_name,value) values('Adam','49,89,43');
Query OK, 1 row affected (0.20 sec)

登録済みレコードの確認

select文でテーブルの中身を表示してみます。

mysql> select *from demo17;

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

+----+------------+----------+
| id | first_name | value    |
+----+------------+----------+
|  1 | John       | 50       |
|  2 | David      |          |
|  3 | Adam       | 50,89    |
|  4 | Adam       | 49,89,43 |
+----+------------+----------+
4 rows in set (0.00 sec)

find_in_set()で特定の値を検索する

ここで、「value」カラム内に「50」という値が含まれているレコードを検索してみます。以下のクエリを実行してください。

mysql> select *from demo17 where find_in_set(50,value);

実行結果:

+----+------------+-------+
| id | first_name | value |
+----+------------+-------+
|  1 | John       | 50    |
|  3 | Adam       | 50,89 |
+----+------------+-------+
2 rows in set (0.00 sec)

実行結果のポイント

注目すべき点は、id=3のレコードです。「50,89」というカンマ区切りの文字列の中に「50」が含まれているため、正しく抽出されています。

もしLIKE句や正規表現(REGEXP)で「%50%」のように検索すると、「450」や「500」など、意図しない部分一致のレコードまでヒットしてしまう可能性があります。find_in_set()はカンマで区切られた要素単位で完全一致を判定するため、こうした誤検出を防げるのが大きなメリットです。

まとめ

  • カンマ区切りのリストから特定の値を検索するには、find_in_set() 関数を使うのが最適。
  • find_in_set()は要素単位での完全一致判定なので、部分一致による誤検出がない。
  • 正規表現やLIKE句を使う必要はないが、より柔軟なパターンマッチが必要な場合のみREGEXPを検討するとよい。
  1. Javaで文字列のリストをカンマ区切りの文字列に変換する方法

    この記事では、Javaを使って文字列のリスト(List)をカンマ区切りの1つの文字列に変換する方法について解説します。 リスト(List)とは リストとは、要素を順序どおりに格納し、インデックスを使ってアクセスできるコレクションです。要素の挿入・更新・削除・検索をインデックスベースで行えるメソッドが用意されており、重複した要素を持つこともできます。 今回実現したい処理は以下のとおりです。 入力例 Input list: [Java, Scala, Python] 期待される出力 The list with comma separated elements: Java, Scala, Pytho

  2. 【Python入門】文字列が文字リストに含まれるか判定する方法(その逆も解説)

    Pythonでは、ある文字列が文字のリスト(リスト内の連結した文字)の中に存在するかどうかを確認したい場面があります。そのような場合は、「in」演算子と「join」メソッドを組み合わせることで、シンプルかつ効率的に判定できます。 以下に具体的な実装例を示します。 サンプルコード my_string = python print(The string is :) print(my_string) my_key = [p, y, t, h, o, n, t, e, s, t] print(The key is ) print(my_key) joined_list = .join(my_key