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

【MySQL】FIND_IN_SET()でカンマ区切りの数値リストから特定の値を含む行を抽出する方法

カンマ区切りで格納された数字のリストの中に、特定の数値が含まれている行を検索したい場合には、MySQLの FIND_IN_SET() 関数を使用します。まずはサンプル用のテーブルを作成しましょう。

mysql> create table DemoTable
   (
   CustomerId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   CustomerName varchar(20),
   CustomerAllProductPrice text
   );
Query OK, 0 rows affected (0.30 sec)

次に、INSERTコマンドを使ってレコードを挿入します。ここでは、カンマで区切られた複数の数値(商品価格のリストなど)を1つの列に格納しています。

mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('Chris','245,345,678,90,45,56,78');
Query OK, 1 row affected (0.03 sec)

mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('Chris','98,99,90,56,77');
Query OK, 1 row affected (0.07 sec)

mysql> insert into DemoTable(CustomerName,CustomerAllProductPrice) values('David','1000,2000,4000,56000');
Query OK, 1 row affected (0.06 sec)

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

mysql> select *from DemoTable;

上記のクエリを実行すると、次のような結果が出力されます。

+------------+--------------+-------------------------+
| CustomerId | CustomerName | CustomerAllProductPrice |
+------------+--------------+-------------------------+
|          1 | Chris        | 245,345,678,90,45,56,78 |
|          2 | Chris        | 98,99,90,56,77          |
|          3 | David        | 1000,2000,4000,56000    |
+------------+--------------+-------------------------+
3 rows in set (0.00 sec)

特定の数値を含む行を抽出するクエリ

以下が、カンマ区切りの数値リストの中に特定の数値(ここでは「4000」)が含まれる行を抽出するクエリです。

mysql> select *from DemoTable where find_in_set('4000',CustomerAllProductPrice);

実行結果は次のとおりです。「4000」を含む行だけが正しく取得できていることがわかります。

+------------+--------------+-------------------------+
| CustomerId | CustomerName | CustomerAllProductPrice |
+------------+--------------+-------------------------+
|          3 | David        | 1000,2000,4000,56000    |
+------------+--------------+-------------------------+
1 row in set (0.14 sec)

FIND_IN_SET()関数の仕組み

FIND_IN_SET(検索値, 対象文字列) は、カンマ区切りの文字列リストの中に指定した値が存在するかどうかを調べる関数です。見つかった場合はその位置(1始まりのインデックス)、存在しない場合は 0 を返します。WHERE句でこの戻り値が真(0より大きい)になる条件を指定することで、目的の行だけを効率的に絞り込めます。

注意点:LIKE検索との違い

単純に LIKE '%4000%' とすると、「14000」や「40001」など、部分一致する別の数値まで誤ってヒットしてしまう可能性があります。FIND_IN_SET() はカンマ区切りの要素単位で完全一致を判定するため、このような誤検出を防ぐことができます。

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

    MySQLでは、カンマ区切りで複数の値が格納された列から特定の値を含むレコードを抽出したいケースがあります。そんなときに便利なのが FIND_IN_SET() 関数です。この関数を使うと、カンマ区切りの文字列の中に指定した値が存在するかどうかを簡単に判定できます。この記事では、実際にテーブルを作成し、FIND_IN_SET() を使って特定のレコードを検索する手順を解説します。1. テーブルの作成まず、カンマ区切りの値を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> ListOfValue varch

  2. MySQLですべての行の値をカンマ区切りの単一の行として表示する方法

    GROUP_CONCAT()とCONCAT()を使って複数行の値を1行にまとめる方法MySQLでテーブル内の複数の行に格納された値を、カンマ(コンマ)で区切られた単一の行として取得したい場合には、GROUP_CONCAT()関数とCONCAT()関数を組み合わせて使用します。GROUP_CONCAT()はグループ内の複数の値を連結して文字列として返し、CONCAT()を使うことで各値の前後に任意の文字を追加できます。以下では、実際の手順をサンプルコードとともに順番に解説していきます。1. サンプルテーブルを作成するまず、テスト用のテーブルを作成します。ここではint型の「Id」カラムを持つシン