SQLを利用してデータベースから特定のパターンを持つデータを抽出する際、LIKE演算子とワイルドカードの組み合わせは欠かせない技術です。
多くの方は「%(パーセント)」記号を用いた前方一致や部分一致の検索を頻繁に利用されていることでしょう。
しかし、特定の文字数や特定の箇所の文字だけを指定して検索したい場合には、もう一つの重要なワイルドカードである「_(アンダースコア)」が非常に強力な力を発揮します。
アンダースコアは「任意の1文字」を表現するための記号であり、データのフォーマットが厳密に決まっているシステムの運用や、正規化が不十分なデータのクレンジングにおいて不可欠な存在です。
本記事では、SQLのアンダースコアワイルドカードの基礎から応用まで、具体的なサンプルコードを交えて詳しく解説します。
SQLのワイルドカード「アンダースコア(_)」の基本概念
SQLにおいてワイルドカードとは、文字列検索の際に「不特定の文字」を表現するために使用される特殊な記号のことです。
一般的に最も普及しているワイルドカードは % であり、これは「0文字以上の任意の文字列」を意味します。
これに対して、今回焦点を当てるアンダースコア(_)は、「正確に任意の1文字」のみを置き換える役割を持っています。
例えば、「A_C」という条件で検索を行った場合、「ABC」や「ADC」はヒットしますが、「AC」や「ABBC」はヒットしません。
このように、文字数を固定して特定のパターンを探し出したい場合に、アンダースコアは非常に便利なツールとなります。
アンダースコアはLIKE演算子と共に使用されることが一般的であり、多くのリレーショナルデータベース(RDBMS)で共通の仕様として採用されています。
LIKE演算子とアンダースコアの基本的な記述方法
アンダースコアを利用した検索の基本構文は、通常のLIKE検索と同じです。
WHERE句において、対象のカラム名とLIKEキーワードを記述し、その後にシングルクォーテーションで囲んだパターンを指定します。
以下のコード例では、3文字の商品のうち、最初が「P」で最後が「S」で終わるものを抽出しています。
-- 3文字の単語で、最初がP、最後がSのデータを検索
SELECT product_name
FROM products
WHERE product_name LIKE 'P_S';
このクエリを実行した結果、以下のようなデータが取得されます。
product_name
------------
PAS
PBS
PCS
PYS
この例からわかるように、中央の「_」が任意の1文字として機能し、文字数が3文字でないデータは除外されます。
もし「PS」という2文字のデータが存在していても、アンダースコアが1文字を要求するため、そのデータは結果に含まれません。
アンダースコア(_)とパーセント(%)の明確な違い
SQL初学者が混同しやすいポイントとして、% と _ の使い分けが挙げられます。
これら二つの違いを正確に理解することは、精度の高い検索クエリを作成するための第一歩です。
| 記号 | 意味 | 文字数の制限 |
|---|---|---|
| % (パーセント) | 0文字以上の任意の文字列 | 制限なし(0文字も含む) |
| _ (アンダースコア) | 任意の1文字 | 必ず1文字としてカウントされる |
例えば、「検索ワード%」と指定すると、「検索ワード」そのものや「検索ワードABC」、「検索ワードについて」など、後続する文字数に関わらず全てが対象になります。
一方で、「検索ワード_」と指定した場合は、「検索ワードA」や「検索ワード1」のように、「後ろに必ず1文字だけ存在するデータ」のみが抽出されます。
実務においては、商品コードや会員番号など、桁数が厳密に定義されているデータのバリデーションや抽出にアンダースコアが重宝されます。
実践的な活用シーンと複数のアンダースコアを組み合わせる方法
アンダースコアは、1つだけでなく複数並べて使用することも可能です。
「___(アンダースコア3つ)」と記述すれば、任意の3文字を意味することになります。
これを利用すると、「特定の桁数を持つデータのみを抽出する」という操作が簡単に行えます。
活用例1:特定の桁数のIDを検索する
例えば、5桁の社員コードのうち、3桁目が「7」である社員を抽出したい場合は以下のように記述します。
-- 3桁目が「7」である5桁の社員コードを検索
SELECT employee_id, employee_name
FROM employees
WHERE employee_id LIKE '__7__';
この指定により、以下のような結果が得られます。
employee_id | employee_name
------------+--------------
10722 | 田中 太郎
AB7XY | 佐藤 次郎
このように、固定長の文字列から特定のパターンの位置を特定して検索する場合、アンダースコアは非常に直感的で使いやすい手法です。
活用例2:先頭が特定の文字で、全4文字のデータを検索する
特定のプレフィックス(接頭辞)を持ちつつ、全体の長さが決まっている場合にも有効です。
-- 「TEST」という文字で始まり、その後に1文字続くデータを検索
-- (例:TEST1, TESTAなどはヒットするが、TESTやTEST12はヒットしない)
SELECT log_id
FROM system_logs
WHERE log_id LIKE 'TEST_';
アンダースコアとパーセントを併用する高度な検索
アンダースコアとパーセントを組み合わせることで、さらに柔軟なパターンマッチングが可能になります。
例えば、「2文字目に必ず ‘A’ がくる全てのデータ」を検索したい場合、以下のようなクエリを作成します。
-- 2文字目が 'A' である全てのデータを検索(3文字目以降は何文字でも良い)
SELECT username
FROM users
WHERE username LIKE '_A%';
このクエリでは、最初の _ が1文字目を規定し、2文字目に A が指定され、その後の % が残りの任意の文字列をカバーしています。
「James」という名前であれば、2文字目が「a」ですので(大文字小文字の区別設定によりますが)条件に一致します。
一方、「Apple」は1文字目が「A」であるため、この条件(2文字目がA)には合致しません。
このように、特定の場所にある文字をピンポイントで指定しつつ、全体の長さには幅を持たせたい場合に、このテクニックが非常に有効です。
特殊なケース:アンダースコア(_)自体を検索する方法
実務でしばしば直面するのが、データの中に本物のアンダースコアが含まれている場合です。
例えば「user_id」や「data_01」といった文字列を検索したい時、単に LIKE '%_%' と書くと、全ての文字列がヒットしてしまいます。
なぜなら、前述の通りSQLにおいてアンダースコアはワイルドカードとして解釈されるからです。
このような場合、「エスケープ文字」を使用して、アンダースコアをただの文字として扱うように指示する必要があります。
-- 実際に「_」という文字が含まれるデータを検索する
-- ESCAPEキーワードを使用して、直後の記号をリテラルとして扱う
SELECT file_name
FROM files
WHERE file_name LIKE '%#_%' ESCAPE '#';
この例では # をエスケープ文字として定義しています。
#_ と記述することで、直後の _ はワイルドカードではなく、「文字としてのアンダースコア」として認識されます。
エスケープ文字には # 以外にも $ や / など、検索対象の文字列に含まれない任意の記号を使用することが可能です。
ただし、データベースの種類(MySQL, PostgreSQL, SQL Serverなど)によってデフォルトのエスケープ動作が異なる場合があるため、利用している環境の公式ドキュメントを併せて確認することが推奨されます。
アンダースコア検索におけるパフォーマンス上の注意点
アンダースコアを利用した検索において注意すべきなのは、検索パフォーマンスへの影響です。
一般的に、LIKE演算子を使用したワイルドカード検索は、前方一致(例:'ABC%')であればインデックスが効くことが多いです。
しかし、先頭にアンダースコアやパーセントを配置した「中置一致」や「後方一致」(例:'_ABC' や '%ABC')の場合、データベースはフルテーブルスキャン(全件探索)を行う可能性が高くなります。
特に大量のデータを保持するテーブルに対して WHERE column LIKE '____'(4文字のデータ検索)といったクエリを投げると、処理に時間がかかることがあります。
文字数そのものを条件にしたい場合は、LENGTH() 関数や LEN() 関数と、特定の文字を抽出する SUBSTRING() 関数を組み合わせたほうが可読性やパフォーマンスが向上する場合もあります。
アンダースコアは便利な機能ですが、検索の対象となるデータ量とインデックスの効き方を意識して使用するようにしましょう。
各データベース製品による挙動の違い
SQL標準ではアンダースコアの挙動は定義されていますが、細かい仕様はRDBMSによって異なる場合があります。
例えば、MySQLではデフォルトで大文字と小文字を区別せずにLIKE検索を行う設定(Collation)になっていることが多いですが、PostgreSQLでは LIKE は大文字小文字を区別し、区別しない場合は ILIKE を使用します。
また、Oracle Databaseでは全角のアンダースコア(_)をワイルドカードとして認識しないのが一般的ですが、一部の設定やマルチバイト文字の扱いによって挙動が左右されることもあります。
開発環境と本番環境で異なるデータベースエンジンを使用している場合、ワイルドカードの挙動に起因する予期せぬバグが発生しないよう、事前に動作確認を行うことが重要です。
まとめ
SQLのワイルドカード「アンダースコア(_)」は、任意の1文字を表現するための強力なツールです。
% が「不特定多数の文字」をカバーするのに対し、アンダースコアは「厳密な1文字」を指定できるため、固定フォーマットの検索や文字数指定の検索において無類の利便性を誇ります。
複数のアンダースコアを組み合わせたり、パーセント記号と併用したりすることで、複雑なデータ抽出条件もシンプルに記述することが可能になります。
ただし、アンダースコア自体を検索する際のエスケープ処理や、先頭ワイルドカードによるパフォーマンス低下には注意が必要です。
これらの特性を正しく理解し、LIKE演算子を使いこなすことで、より精緻で効率的なデータ操作を実現していきましょう。
日常的なデータ抽出作業の中で、単なる部分一致検索では不十分な場面に出会った際は、ぜひこのアンダースコアの活用を検討してみてください。
