WHERE句にLIKEとワイルドカードであいまい検索

WHERE句の条件検索の中で便利な検索方法がLIKEを使ったあいまい検索です。指定した文字パターンに合致しているか否かで検索ができるので、正確にすべて話わからないけれど、頭文字が「あ」から始まるデータ、二番目の文字が「い」で合計3文字の文字列データなどあいまいな条件でデータ検索ができます。あいまい検索にはLIKEとワイルドカードがポイントになります。

覚えるべきキーワード

・WHERE 列名 LIKE ‘文字パターン’
・ワイルドカード
・%(パーセント)
・_(アンダースコア)
・WHERE 列名 LIKE ‘文字パターン’ ESCAPE ‘エスケープ文字’;

このサンプルテーブルを使って以下のSQLを解説します。

サンプルテーブル1

(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
10 SATOU 01-Aug-10 1000
11 KATOU 12-Apr-98 2000
12 YAMADA 25-May-02 5500
13 ISHII 9-Jan-00 6000
14 YASUDA 20-Mar-11 7000

WHERE 列名 LIKE ‘文字パターン’と%(パーセント)

LIKE演算子と%(パーセント)を使ってあいまい検索を行います。%は0文字以上の任意文字の検索に使います。以下がサンプルのSQLです。

WHERE 列名 LIKE ‘文字パターン’と%

SELECT id,name,bd,h_salary FROM employee WHERE name LIKE ‘YA%’;

これはname列のフィールドに入っているYAから始まるレコードを取得します。

(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
12 YAMADA 25-May-02 5500
14 YASUDA 20-Mar-11 7000

name列でYAから始まるフィールドはYAMADAとYASUDAですので、この2つが検索対象になります。そのため、YAMADAとYASUDAのid、name,bd,h_salaryを取得します。%は任意の0文字以上なので、WHERE name LIKE ‘%YA%’でもYAMADAとYASUDAが検索対象になります。%は1つの文字パターンの中でいくつも使ってよいので、例えば、文字列のどこかに「小」の文字が入っていた記憶があるならLIKE ‘%小%’で検索すれば、’大阪小学校’も’小児科’も’大中小’も検索に引っかかります。最もあいまいな検索をしたいときは%が便利です。

WHERE 列名 LIKE ‘文字パターン’と_(アンダースコア)

_(アンダースコア)は、任意の1文字検索に使います。%よりも少し正確性を高めるあいまい検索で使用します。1文字だけは何でも良い文字列を検索する際に使います。

(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
12 YAMADA 25-May-02 5500

‘YAM_DA’で検索しているので、YAMADAやYAMODA、YAMEDAなどが検索対象となりますが、employeeテーブルには対象となりそうなデータはYAMADAだけなので、nameがYAMADAのレコードを取得します。LIKEでは取得できたYASUDAは今回対象外となります。

WHERE 列名 LIKE ‘文字パターン’と_(アンダースコア)と_(アンダースコア)

_(アンダースコア)を2つ以上使ったあいまい検索です。これは_(アンダースコア)1つよりもあいまいですが、LIKEほどあいまいではありません。

WHERE 列名 LIKE ‘文字パターン’と_と_

SELECT id,name,bd h_salary FROM employee WHERE name like ‘YA_ _DA’;

これはYAMADAやYASUDA、YAKODAなどが取得対象となります。2つのアンダースコアなので、YAIDAは対象外です。YAとDAの間に1文字のIしかありませんので、検索に引っかかりません。_ (アンダースコア)はいくつでも使用できますので、文字数は分かっているけど、正確な文字列が分からない時に有効です。

WHERE 列名 LIKE ‘文字パターン’ ESCAPE ‘ESCAPE文字’

次に%(パーセント)や_アンダースコアを検索対象の文字列に含みたいときはESCAPE文字を使いましょう。例えば○○%や_KEIなどを検索にしたいときなどですね。
ここではサンプルテーブル2を使います。
サンプルテーブル2

(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
10 SAKU_SATO 01-Aug-10 1000
11 SAKI_KATOU 12-Apr-98 2000
12 SAE_KAWAI 25-May-02 5500
WHERE 列名 LIKE ‘文字パターン’ ESCAPE ‘ESCAPE文字’

SELECT id,name,bd,h_salary FROM name LIKE ‘SAK_\_%’ ESCAPE ‘\’;

まずエスケープ文字は検索文字列に含まれない1バイト文字を指定できます。サンプルでは\を用いていますが、@なども使えます。この検索では‘SAK_\_%’ ESCAPE ‘\’
となっていますのでSAKから始まった後に1文字入って_(アンダースコア)が入って、その後は0文字以上の任意の文字が検索対象になります。SAKから始まって1文字入るのはSAKUとSAKIです。SAEはこの時点で対象外となります。続いて_(アンダースコア)が入っています。SAKUもSAKIもその後に_(アンダースコア)が入っています。最後の%(パーセント)は0文字以上の任意文字なので、SATOもKATOUも対象となります。よって、SAKU_SATOもSAKI_KATOUも‘SAK_\_%’ ESCAPE ‘\の検索条件に合致するので、結果は以下のようになります。
(テーブル名:employee、id:数値型、name:文字型、bd:日付(デフォルトはDD-MON-RR)、h_salary:数値型)

ID NAME BD H_SALARY
10 SAKU_SATO 01-Aug-10 1000
11 SAKI_KATOU 12-Apr-98 2000

%と_の使い分けを完璧にしておけば、レコードを調べたい時に検索範囲をコントロールして検索ができます。広範囲で検索したい時は%で、もっと範囲を絞れる時は_を使うなどです。LIKEは良く使う演算子なので、使い方はしっかり覚えておきましょう。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です