MySQLでカンマ区切りの値から特定の値を含むレコードを抽出する方法(REGEXP活用)
MySQLでは、REGEXP(正規表現)を使用することで、カンマ区切りの値の中に特定の値が含まれるレコードを簡単に抽出できます。例えば、カンマ区切りの値のいずれかが「90」である行だけを取得したい場合に、正規表現が役立ちます。
1. テーブルの作成
まず、サンプル用のテーブルを作成します。
mysql> create table DemoTable1447
-> (
-> Value varchar(100)
-> );
Query OK, 0 rows affected (0.58 sec)2. レコードの挿入
INSERT文を使って、カンマ区切りの値を持つ複数のレコードを挿入します。
mysql> insert into DemoTable1447 values('19,58,90,56');
Query OK, 1 row affected (0.13 sec)
mysql> insert into DemoTable1447 values('56,89,99,100');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1447 values('75,76,65,90');
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable1447 values('101,54,57,59');
Query OK, 1 row affected (0.14 sec)3. 全レコードの確認
SELECT文で、テーブル内のすべてのレコードを表示してみましょう。
mysql> select * from DemoTable1447;
実行結果は以下の通りです。
+--------------+ | Value | +--------------+ | 19,58,90,56 | | 56,89,99,100 | | 75,76,65,90 | | 101,54,57,59 | +--------------+ 4 rows in set (0.00 sec)
4. 特定の値(90)を含むレコードを取得するクエリ
カンマ区切りの値の中から、特定の値(ここでは「90」)に基づいてレコードを取得するには、次のようにREGEXPを使用します。
mysql> select * from DemoTable1447 where Value regexp '(^|,)90($|,)';
この正規表現「(^|,)90($|,)」は、「90」が文字列の先頭・末尾、あるいはカンマで区切られた独立した値として存在することを意味します。これにより、「190」や「900」のような部分一致は除外されます。
実行結果は以下の通りです。「90」を含む2件のレコードのみが正しく抽出されました。
+-------------+ | Value | +-------------+ | 19,58,90,56 | | 75,76,65,90 | +-------------+ 2 rows in set (0.00 sec)
補足:FIND_IN_SET関数との使い分け
同様の処理は、FIND_IN_SET関数でも実現できます。WHERE FIND_IN_SET(90, Value) > 0 のように記述すれば、正規表現を使わずに同じ結果が得られます。単純な完全一致ならFIND_IN_SETがシンプルですが、より柔軟なパターンマッチングが必要な場合はREGEXPが便利です。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLで最大の累積値とその出現回数を取得するクエリの書き方
カラム同士を掛け合わせた値(累積値)の中から最大値と、その出現回数を取得したい場合は、集計関数 COUNT(*) をサブクエリと組み合わせて使用します。あわせて GROUP BY 句も活用します。テーブルの作成まず、以下のコマンドでテーブルを作成しましょう。mysql> create table demo23-> (-> id int not null auto_increment primary key,-> value1 int,-> value2 int-> );Query OK, 0 rows affected (1.65 sec)レコードの挿入続い