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

MySQLでカンマ区切りの値が格納されたテーブル内を検索する方法


MySQLでカンマ区切りの値を検索するには

カンマ区切りの値が格納されたカラムを持つテーブル内を検索するには、LIKE演算子を使用します。まずはサンプル用のテーブルを作成しましょう。

mysql> create table DemoTable675(Value text);
Query OK, 0 rows affected (0.55 sec)

レコードの挿入

insertコマンドを使って、テーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable675 values('10,56,49484,93993,211,4594');
Query OK, 1 row affected (0.28 sec)
mysql> insert into DemoTable675 values('4,7,1,10,90,23');
Query OK, 1 row affected (0.41 sec)
mysql> insert into DemoTable675 values('90,854,56,89,10');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable675 values('11,22,344,67,89');
Query OK, 1 row affected (0.10 sec)

テーブルの中身を確認する

select文ですべてのレコードを表示してみましょう。

mysql> select *from DemoTable675;

実行すると、次のような出力が得られます。

+----------------------------+
| Value                      |
+----------------------------+
| 10,56,49484,93993,211,4594 |
| 4,7,1,10,90,23             |
| 90,854,56,89,10            |
| 11,22,344,67,89            |
+----------------------------+
4 rows in set (0.00 sec)

LIKE演算子を使った検索クエリ

カンマ区切りの値の中から「10」を検索するには、値の位置(先頭・中間・末尾・単独)に応じて複数の条件を組み合わせます。以下がそのクエリです。

mysql> select *from DemoTable675
    WHERE Value LIKE '10,%'
    OR Value LIKE '%,10'
    OR Value LIKE '%,10,%'
    OR Value = '10';

実行結果は次の通りです。「10」を含む3件のレコードだけが抽出されました。

+----------------------------+
| Value                      |
+----------------------------+
| 10,56,49484,93993,211,4594 |
| 4,7,1,10,90,23             |
| 90,854,56,89,10            |
+----------------------------+
3 rows in set (0.00 sec)

なぜ4つの条件が必要なのか

単純に LIKE '%10%' としてしまうと、「110」や「210」のように「10」を部分文字列として含む別の数値まで誤ってマッチしてしまいます。そこで、次の4パターンに分けて検索する必要があります。

  • Value LIKE '10,%' … 値が先頭にある場合
  • Value LIKE '%,10' … 値が末尾にある場合
  • Value LIKE '%,10,%' … 値が中間にある場合
  • Value = '10' … カンマ区切りではなく単独の値である場合

補足:FIND_IN_SET関数を使うとさらに簡単

MySQLでは、FIND_IN_SET関数を使えば、同じ検索をもっと簡潔に書けます。

mysql> select *from DemoTable675
    WHERE FIND_IN_SET('10', Value) > 0;

FIND_IN_SETは、第2引数のカンマ区切りリスト内に第1引数の文字列が存在すればその位置(1以上の数値)、存在しなければ0を返します。これにより、値がリストのどの位置にあっても1つの条件で正確に検索できます。

設計上の注意: カンマ区切りの値を1つのカラムに格納する設計は、データベースの第一正規形に反するため、インデックスが利用できず検索性能が低下しやすいという欠点があります。本番環境では、関連を表す中間テーブルを作成してデータを正規化しておくことをおすすめします。


  1. MySQLでテーブルからランダムな値を3件表示する方法

    MySQLのテーブルからランダムな値を取得したい場合は、RAND()関数を使用します。取得する件数はLIMIT句で指定します。今回は3件を取得する例を見ていきましょう。select yourColumnName from yourTableName order by rand() limit 3;それでは、実際にサンプルテーブルを作成しながら手順を確認していきます。1. サンプルテーブルの作成まず、create table文でテーブルを作成します。mysql> create table DemoTable646 (     Id int NOT N

  2. MySQLでテーブル内の^(キャレット)文字を検索する方法

    MySQLで^文字を検索するには?MySQLのテーブルやカラム名に含まれる^(キャレット)文字を検索したい場合は、LIKE演算子を使用します。特に、information_schemaデータベースのcolumnsテーブルを参照することで、データベース全体から^を含むカラム名を効率的に特定できます。基本の検索構文以下の構文を使用して、^文字を含むカラムを検索できます。select table_schema, table_name, column_namefrom information_schema.columnswhere column_name like %^%;このクエリは、スキーマ名(t