T-SQL - LIKE を使ってアンダースコア(_)やパーセント(%)を含む文字列を探す方法
LIKE オペレーターとワイルドカード
SELECT 文を書く時に、WHERE 句で LIKE オペレーターを使って、特定の文字やパターンを含む値を持つレコードを取得する機会があると思います。
LIKE オペレーターでは、いくつかの文字はワイルドカードとして扱われます。
パーセント(%) ワイルドカード
パーセント(%)は 「 0 個以上の何らかの文字列 」という意味のワイルドカードです。
前方一致で条件をしたい時は検索したい文字列の後に、部分一致にしたい時は前後に % をつけることでその文字列を含む値を持つレコードを検索することができます。
次のような Student テーブルがあります。
LastName が Ta で始まる学生のレコードは次のように取得できますね。
SELECT * FROM Student WHERE LastName LIKE 'Ta%';
アンダースコア(_) ワイルドカード
アンダースコア(_)は 「 1 個の何らかの文字列 」という意味のワイルドカードです。
例えば、LastName の 2 文字目が a の学生のレコードは次のように取得できます。
SELECT * FROM Student WHERE LastName LIKE '_a%';
アンダースコア(_)やパーセント(%)を含む文字列を探す
ここからが本題ですが、LIKE オペレーターを使って、アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、ワイルドカードとしての役割をしないような形で指定しなければなりません。
アンダースコア(_)やパーセント(%)を含む文字列を探したい時は、[] のワイルドカードを使って指定することができます。
[] ワイルドカード は [a] と一文字を指定したり、[abc] のように a,b,c のどれかと指定したり、[a-z] のように範囲を指定して、一文字をマッチさせることのできるワイルドカードです。
例えば FirstName にアンダースコアが含まれる学生のレコードを取得したい時には、次のように指定することができます。
SELECT * FROM Student WHERE FirstName LIKE '%[_]%';
同様に FirstName にパーセントが含まれる学生のレコードを取得したい時には、次のように指定することができます。
SELECT * FROM Student WHERE FirstName LIKE '%[%]%';
一応、もう一つの方法としては、ESCAPE を使って、ESCAPE 文字を挿入してアンダースコア(_)やパーセント(%)をワイルドカードとしての役割をしないようにすることも可能です。
例えば、「|」 という文字を ESCAPE 文字にするのであれば、次のようなクエリーになります。
SELECT * FROM Student WHERE FirstName LIKE '%|_%' ESCAPE '|'; SELECT * FROM Student WHERE FirstName LIKE '%|%%' ESCAPE '|';