リレーショナルデータベースを操作する際、特定の文字列を含むデータを抽出するためにLIKE句を利用する場面は非常に多くあります。
単一のキーワードで検索するだけであれば単純な記述で済みますが、実務においては「AまたはBを含む」といった複数条件での絞り込みが頻繁に求められます。
本記事では、SQLのLIKE句で複数条件を指定する基本的な方法から、ソースコードの可読性や実行速度を向上させるための効率的なテクニックまでを詳しく解説します。
初心者の方から、より高度なクエリ最適化を目指すエンジニアの方まで役立つ内容となっていますので、ぜひ参考にしてください。
LIKE句で複数条件を指定する基本:OR演算子の活用
SQLで複数の検索条件を指定する最も標準的で基本的な方法は、OR演算子を使用してLIKE句を連結することです。
例えば、商品テーブルから「リンゴ」または「バナナ」というキーワードを名前に含むレコードを抽出したい場合、以下のようなクエリを記述します。
-- OR演算子を使用した基本的な複数条件指定
SELECT *
FROM products
WHERE product_name LIKE '%リンゴ%'
OR product_name LIKE '%バナナ%';
この記述方法は、どのSQLデータベース(MySQL、PostgreSQL、SQL Server、Oracleなど)でも共通して利用できるため、汎用性が極めて高いのが特徴です。
しかし、検索したいキーワードが3つ、5つ、10つと増えていくにつれて、WHERE句の記述が非常に冗長になってしまうという欠点があります。
コードが長くなることで、読みやすさが低下し、記述ミスのリスクが高まるため、大量の条件を扱う場合には別の手法を検討する必要があります。
複数の条件すべてに合致させる場合のAND演算子
「いずれかのキーワードを含む」ではなく、「指定したすべてのキーワードを含む」という条件で検索したい場合は、ORではなくAND演算子を使用します。
例えば、商品説明文の中に「期間限定」と「送料無料」の両方のキーワードが含まれているデータを抽出するケースです。
-- AND演算子を使用した絞り込み検索
SELECT *
FROM promotions
WHERE description LIKE '%期間限定%'
AND description LIKE '%送料無料%';
この場合、両方の条件が真(TRUE)となるレコードのみが結果として返されます。
AND条件を増やすことで検索結果をより厳密に絞り込むことができますが、LIKE句の数が増えるとインデックスの効かない検索ではパフォーマンスが著しく低下する可能性があるため注意が必要です。
効率的な複数条件指定:正規表現を利用する方法
データベース製品によっては、正規表現を用いることで、複数のLIKE条件を1つの記述にまとめることができます。
正規表現を利用すれば、OR演算子を繰り返す必要がなくなり、クエリを非常にスッキリと記述できます。
MySQLやGoogle BigQueryでのREGEXP
MySQLやBigQueryでは、REGEXP(またはRLIKE)を使用することで、パイプ記号 | を使った複数条件の指定が可能です。
-- MySQLで正規表現を使用した複数条件指定
SELECT *
FROM users
WHERE email REGEXP 'gmail.com|yahoo.co.jp|outlook.jp';
このクエリは、メールアドレスに「gmail.com」「yahoo.co.jp」「outlook.jp」のいずれかが含まれるユーザーを一度に抽出します。
LIKE句を3回書くよりも、後からキーワードを追加・削除するのが容易であるというメリットがあります。
PostgreSQLでの正規表現演算子
PostgreSQLでは、~ 演算子または SIMILAR TO を使用して同様の処理を行います。
-- PostgreSQLでの正規表現マッチング
SELECT *
FROM articles
WHERE content ~ 'SQL|データベース|クエリ';
大文字と小文字を区別せずに検索したい場合は、~* 演算子を使用することで柔軟な検索が可能になります。
このように、特定のDBエンジンに依存する機能を使うことで、コードの可読性は飛躍的に向上します。
PostgreSQL独自の便利な書き方:ANY演算子と配列
PostgreSQLを利用している場合、正規表現以外にも非常に強力で便利な書き方があります。
それは、ANY演算子と配列(ARRAY)を組み合わせる手法です。
-- PostgreSQL独自のANY演算子を用いた書き方
SELECT *
FROM tags
WHERE tag_name LIKE ANY (ARRAY['%初心者%', '%入門%', '%解説%']);
この記述方法は、プログラム側(PythonやPHPなど)から動的に検索キーワードのリストを渡したい場合に非常に相性が良いです。
WHERE句の中でLIKEをループさせるような冗長なコードを書かずに済むため、PostgreSQL環境では推奨される手法の一つです。
大量のLIKE条件を扱うための実践的なアプローチ
検索条件が数十、数百におよぶ場合、SQL文の中に直接条件を書き込むのは現実的ではありません。
そのような高度なケースでは、条件自体を一時テーブルや共通テーブル式(CTE)として定義し、それらを結合(JOIN)させる方法が有効です。
マスタテーブルとの結合によるフィルタリング
例えば、NGワードリストに含まれるキーワードが商品名のどこかに含まれているレコードを除外したいというケースを考えます。
-- CTEを使用して条件リストと結合する例
WITH pattern_list AS (
SELECT '%広告%' AS pattern
UNION ALL SELECT '%スパム%'
UNION ALL SELECT '%禁止事項%'
)
SELECT DISTINCT t1.*
FROM messages t1
JOIN pattern_list p ON t1.body LIKE p.pattern;
このように、検索パターン自体をデータとして扱うことで、クエリの構造を変えることなく、検索条件の追加や変更を「データの更新」として処理できるようになります。
この手法は、動的な検索システムを構築する際に非常に強力な武器となります。
パフォーマンスに関する重要な注意点
LIKE句による複数条件指定は便利ですが、パフォーマンス面での妥協が必要になることが多々あります。
SQLにおいて、LIKE句の先頭にワイルドカード % を置く「中間一致」や「後方一致」の検索では、通常のB-treeインデックスが使用されません。
| 一致パターン | インデックス利用 | パフォーマンスへの影響 |
|---|---|---|
前方一致 ('キーワード%') | 利用可能 | 高速 |
中間一致 ('%キーワード%') | 原則利用不可 | データ量に比例して低速化 |
後方一致 ('%キーワード') | 原則利用不可 | データ量に比例して低速化 |
特に大量のデータに対して OR LIKE を繰り返すと、フルテーブルスキャンが何度も発生したり、CPU負荷が高まったりする原因になります。
100万件を超えるような大規模なテーブルで複数キーワード検索を高速に行いたい場合は、以下の代替案を検討してください。
- 全文検索インデックス(Full-Text Search):MySQLのFULLTEXTインデックスやPostgreSQLのpg_trgmなどを利用する。
- 外部検索エンジンの導入:ElasticsearchやAlgoliaなどの検索に特化したミドルウェアを併用する。
- 転置インデックスの活用:あらかじめ単語ごとに分解してインデックスを貼る。
検索の要件が「部分一致」であればLIKE句で十分ですが、「キーワード検索機能」として本格的に運用する場合は、LIKE句の限界を知っておくことが重要です。
実務で役立つTips:NOT LIKEの複数指定
「AもBも含まない」という条件を指定したい場合、論理的な扱いに注意が必要です。
OR条件の逆はAND条件になるため、複数のキーワードを除外したいときは AND NOT LIKE を使用します。
-- 複数のキーワードをすべて除外する例
SELECT *
FROM products
WHERE product_name NOT LIKE '%中古%'
AND product_name NOT LIKE '%ジャンク%';
ここを OR で繋いでしまうと、「中古ではない、またはジャンクではない」という意味になり、どちらか一方に当てはまらないだけで抽出対象になってしまうため、意図した結果が得られません。
否定条件の複数指定は、論理演算の基本に立ち返って記述を確認することが大切です。
CASE式とLIKEを組み合わせた条件分岐
特定のキーワードが含まれているかどうかによって、フラグを立てたりスコアを付けたりしたい場合には、CASE式の中でLIKE句を使用します。
-- 内容に応じてカテゴリを分類する
SELECT
customer_feedback,
CASE
WHEN customer_feedback LIKE '%遅い%' OR customer_feedback LIKE '%待たされた%' THEN '配送遅延'
WHEN customer_feedback LIKE '%壊れている%' OR customer_feedback LIKE '%破損%' THEN '品質不良'
ELSE 'その他'
END AS feedback_category
FROM reviews;
このようにLIKE句を複数組み合わせることで、単なるデータの抽出にとどまらず、テキストデータの簡単な分類や分析を行うことが可能になります。
ビジネスロジックをSQL側で一部吸収できるため、レポート作成時などに重宝するテクニックです。
まとめ
SQLのLIKE句で複数条件を指定する方法には、標準的なOR演算子から、各DB固有の正規表現、さらには配列やCTEを用いた高度な手法まで多様な選択肢があります。
小規模なデータや単純なスクリプトであれば OR LIKE で十分ですが、保守性や可読性を重視するなら REGEXP や ANY 演算子の活用が推奨されます。
一方で、LIKE句にはインデックスが効きにくいという特性があるため、パフォーマンスが問題になる場合は全文検索機能への移行も視野に入れるべきです。
それぞれのメリット・デメリットを理解し、プロジェクトの規模や使用しているデータベース製品に最適な書き方を選択してください。
この記事で紹介したテクニックを活用して、より効率的でクリーンなSQLコードを書いていきましょう。
