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

MySQLでLIKE IN()を実現する方法|REGEXPを使った複数条件検索の実装テクニック

MySQLには「LIKE」と「IN()」を組み合わせた構文は直接用意されていませんが、正規表現(REGEXP)を活用することで、IN()のように複数の値をまとめて絞り込むことが可能です。本記事では、REGEXPを使ってLIKE IN()のような動作を実現する方法を、テーブル作成からデータ挿入、IN()との結果比較まで、具体的なサンプルコードとともに解説します。

REGEXPを使った基本構文

複数の値をOR条件を表す「|」(パイプ)でつなげてREGEXPに渡すことで、「いずれかに一致するレコード」を抽出できます。基本的な構文は以下の通りです。

SELECT * FROM テーブル名 WHERE カラム名 REGEXP '値1|値2|値3……|値N';

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> CREATE TABLE INDemo (
    ->   Id INT,
    ->   Name VARCHAR(100)
    -> );
Query OK, 0 rows affected (0.90 sec)

テストデータの挿入

続いて、いくつかのレコードをテーブルに挿入します。

mysql> INSERT INTO INDemo VALUES(100,'John');
Query OK, 1 row affected (0.13 sec)
mysql> INSERT INTO INDemo VALUES(104,'Carol');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO INDemo VALUES(108,'David');
Query OK, 1 row affected (0.19 sec)
mysql> INSERT INTO INDemo VALUES(112,'Smith');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO INDemo VALUES(116,'Johnson');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO INDemo VALUES(120,'Sam');
Query OK, 1 row affected (0.16 sec)

全レコードの確認

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

mysql> SELECT * FROM INDemo;

実行結果:

+------+---------+
| Id   | Name    |
+------+---------+
| 100  | John    |
| 104  | Carol   |
| 108  | David   |
| 112  | Smith   |
| 116  | Johnson |
| 120  | Sam     |
+------+---------+
6 rows in set (0.00 sec)

REGEXPでIN()と同じ検索を実行する

それでは、冒頭で紹介した構文を使って、Idが「112」「116」「100」のいずれかに一致するレコードを抽出してみます。

mysql> SELECT * FROM INDemo WHERE Id REGEXP '112|116|100';

実行結果:

+------+---------+
| Id   | Name    |
+------+---------+
| 100  | John    |
| 112  | Smith   |
| 116  | Johnson |
+------+---------+
3 rows in set (0.21 sec)

IN()との結果比較

同じ条件をIN()で記述した場合と比較してみましょう。

mysql> SELECT * FROM INDemo WHERE Id IN(112,116,100);

実行結果:

+------+---------+
| Id   | Name    |
+------+---------+
| 100  | John    |
| 112  | Smith   |
| 116  | Johnson |
+------+---------+
3 rows in set (0.00 sec)

このように、REGEXPとIN()のどちらを使っても同じ結果が得られることが確認できました。

注意点:部分一致による意図しないマッチに気をつける

REGEXPは文字列の部分一致で判定されるため、数値カラムに対して使う場合は注意が必要です。たとえば「100」というパターンは「1100」や「2100」にも一致してしまう可能性があります。完全一致させたい場合は、アンカー(^ と $)を組み合わせて次のように記述すると安全です。

mysql> SELECT * FROM INDemo WHERE Id REGEXP '^(112|116|100)$';

また、単純な完全一致の比較だけであれば、通常はIN()の方が高速で可読性も高い傾向があります。REGEXPは「前方一致・後方一致・部分一致など、柔軟なパターンマッチを複数条件で行いたい場合」にこそ真価を発揮するので、用途に応じて使い分けるのがおすすめです。

  1. MySQLで複数のLIKE演算子をORDER BYと組み合わせる方法

    MySQLでは、複数のLIKE演算子をORDER BY句の中で組み合わせることで、指定したキーワードにより多く一致するレコードを優先的に並べ替えることができます。このテクニックは、LIKE演算子が「一致すれば1」「一致しなければ0」を返すという性質を利用しています。各条件の結果を足し合わせることで一致数を計算し、降順(DESC)にソートすることで、関連度の高いレコードを上位に表示できるのです。以下は、複数のLIKE演算子をORDER BYと組み合わせて実装する際の基本構文です。select *from yourTableName order by ( yourColumnName li

  2. 動的配列を活用したMySQLのLIKEクエリ実装方法を解説

    動的配列に対するLIKEクエリの基本構文 MySQLでカンマ区切りの複数値(いわゆる動的な配列)が格納されたカラムに対してLIKEクエリを実行したい場合、LIKE句とワイルドカード「%」を組み合わせることで部分一致検索が可能です。基本となる構文は以下の通りです。 select *from yourTableName     where yourColumnName2 like %yourValue%     order by yourColumnName1 asc     l