T-SQL - LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法

LIKE オペレーターとワイルドカード

SELECT 文を書く時に、WHERE 句で LIKE オペレーターを使って、特定の文字やパターンを含む値を持つレコードを取得する機会があると思います。

LIKE オペレーターでは、いくつかの文字はワイルドカードとして扱われます。


パーセント(%) ワイルドカード

パーセント(%)は 「 0 個以上の何らかの文字列 」という意味のワイルドカードです。

前方一致で条件をしたい時は検索したい文字列の後に、部分一致にしたい時は前後に % をつけることでその文字列を含む値を持つレコードを検索することができます。

次のような Student テーブルがあります。

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 1

LastName が Ta で始まる学生のレコードは次のように取得できますね。

SELECT * FROM Student WHERE LastName LIKE 'Ta%';

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 2


アンダースコア(_) ワイルドカード

アンダースコア(_)は 「 1 個の何らかの文字列 」という意味のワイルドカードです。

例えば、LastName の 2 文字目が a の学生のレコードは次のように取得できます。

SELECT * FROM Student WHERE LastName LIKE '_a%';

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 3

アンダースコア(_)やパーセント(%)を含む文字列を探す

ここからが本題ですが、LIKE オペレーターを使って、アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、ワイルドカードとしての役割をしないような形で指定しなければなりません。

アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、[] のワイルドカードを使って指定することができます。

[] ワイルドカード は [a] と一文字を指定したり、[abc] のように a,b,c のどれかと指定したり、[a-z] のように範囲を指定して、一文字をマッチさせることのできるワイルドカードです。


例えば FirstName にアンダースコアが含まれる学生のレコードを取得したい時には、次のように指定することができます。

SELECT * FROM Student WHERE FirstName LIKE '%[_]%';

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 4

同様に FirstName にパーセントが含まれる学生のレコードを取得したい時には、次のように指定することができます。

SELECT * FROM Student WHERE FirstName LIKE '%[%]%';

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 5


一応、もう一つの方法としては、ESCAPE を使って、ESCAPE 文字を挿入してアンダースコア(_)やパーセント(%)をワイルドカードとしての役割をしないようにすることも可能です。

例えば、「|」 という文字を ESCAPE 文字にするのであれば、次のようなクエリーになります。

SELECT * FROM Student WHERE FirstName LIKE '%|_%' ESCAPE '|';

SELECT * FROM Student WHERE FirstName LIKE '%|%%' ESCAPE '|';

LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法 6

© 2010-2024 SQL Server 入門