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は「前方一致・後方一致・部分一致など、柔軟なパターンマッチを複数条件で行いたい場合」にこそ真価を発揮するので、用途に応じて使い分けるのがおすすめです。
-
MySQLで複数のLIKE演算子をORDER BYと組み合わせる方法
MySQLでは、複数のLIKE演算子をORDER BY句の中で組み合わせることで、指定したキーワードにより多く一致するレコードを優先的に並べ替えることができます。このテクニックは、LIKE演算子が「一致すれば1」「一致しなければ0」を返すという性質を利用しています。各条件の結果を足し合わせることで一致数を計算し、降順(DESC)にソートすることで、関連度の高いレコードを上位に表示できるのです。以下は、複数のLIKE演算子をORDER BYと組み合わせて実装する際の基本構文です。select *from yourTableName order by ( yourColumnName li
-
動的配列を活用したMySQLのLIKEクエリ実装方法を解説
動的配列に対するLIKEクエリの基本構文 MySQLでカンマ区切りの複数値(いわゆる動的な配列)が格納されたカラムに対してLIKEクエリを実行したい場合、LIKE句とワイルドカード「%」を組み合わせることで部分一致検索が可能です。基本となる構文は以下の通りです。 select *from yourTableName where yourColumnName2 like %yourValue% order by yourColumnName1 asc l