【SQLServer】特殊文字「%」「_」を含めた文字列を、LIKE演算子で検索する方法|ESCAPE演算子についても解説

Web開発

SQLServerで、LIKE演算子でパターマッチ検索する時に、特殊文字「%」「_」を単なる文字として検索をしたい!!!

LIKE演算子で検索を行う際に、「%」「_」の特殊文字は特別な意味を持ち、これそのままでは文字列として扱うことはできませんが、この2つの文字を検索文字列として使用する場合に「[]」を使用してエスケープ処理をすることで、文字列として扱うことができるようになります。

エスケープ処理で使用される「[]」も、また同じ「[]」でエスケープ処理することができます。

また、エスケープ処理に使われる文字は、「[]」がデフォルトですが、ESCAPE演算子を使用することで、エスケープ処理の文字を変更することができます。

MySQLではエスケープの方法が「[]」ではなく「\」になりますので、注意が必要です。 MySQL使用の方は、下記の記事を参考にしてみてください。

記事のポイント
  • 「%」「_」を検索文字列として扱うためのエスケープ処理が分かる
  • エスケープ処理のデフォルト文字を変更する「ESCAPE演算子」について理解できる

特殊文字「%」「_」と「[]」をエスケープする

LIKE演算子の中で「%」「_」は、任意の文字列や任意の1文字といった特別な意味を持っていますが、これらを特殊な文字ではなく普通の文字として扱いたい場合には、「[]」を使ってエスケープする必要があります。

また、エスケープに使用する「\」も「」でエスケープすることが可能です。

使用する場合は、次のように記載します。

  • [%]
  • [_]
  • [[]

ここでは、下記のテーブルとデータを作成して検証します。 ご自分の開発環境にコピペして使用してください。

CREATE TABLE user_table
    (id int, name varchar(30), address varchar(50))
;
    
INSERT INTO user_table
    (id,name, address)
VALUES
    ('1','Aoki', 'Aomori_aomori'),
    ('2','Akiyama', 'Akita_akita'),
    ('3','Iwasaki', 'Iwate-morioka'),
    ('4','Yamada', 'Yamagata_yamagata'),
    ('5','Miyauti', 'Miyagi-sendai'),
    ('6','Fukuda', 'Fukushima_fukushima')
;

テーブルとデータが準備できたので、実際にテーブルから「_」を含むデータを抽出してみます。

まずは、エスケープ文字を使用しない場合ですが、実行結果として意図しないデータが返ってきます。

【クエリ】

SELECT
  *
FROM
  user_table
WHERE
  address LIKE '%_%'
;

【実行結果】

idnameaddress
1AokiAomori_aomori
2AkiyamaAkita_akita
3IwasakiIwate-morioka
4YamadaYamagata_yamagata
5MiyautiMiyagi-sendai
6FukudaFukushima_fukushima

では、エスケープ文字を使用して、実行してみます。

【クエリ】

SELECT
  *
FROM
  user_table
WHERE
  address LIKE '%[_]%'
;

【実行結果】

idnameaddress
1AokiAomori_aomori
2AkiyamaAkita_akita
4YamadaYamagata_yamagata
6FukudaFukushima_fukushima

無事に「_」を含むデータのみを抽出することができました。

ESCAPE演算子でエスケープ処理のデフォルト文字を変更する

エスケープ文字は通常デフォルトで「[]」ですが、ESCAPE演算子を使うことで、この文字を変更することが可能です。

ちなみに、MySQLでも同じようにESCAPE演算子は使用可能です。

それでは、下記のテーブルとデータを準備して検証してみましょう。

CREATE TABLE fruit_table
    (id int, name varchar(20), price int, discount varchar(5))
;
    
INSERT INTO fruit_table
    (id,name, price, discount)
VALUES
    ('1','ringo', '230', '10%'),
    ('2','mikan', '130', '5%'),
    ('3','momo', '350', ''),
    ('4','ichigo', '420', '20%')
;

discountのところに割引率を格納しています。 このデータの中から「%」のついた割引商品だけを取り出してみます。

これまで通り、デフォルトのエスケープ文字「[]」を使ってクエリを書くことはできますが、ここでは、エスケープ文字を「[]」から「#」へ変更してみたいと思います。

【クエリ】

SELECT
  *
FROM
  fruit_table
WHERE
  discount LIKE '%#%%' ESCAPE '#'
;

【実行結果】

idnamepricediscount
1ringo23010%
2mikan1305%
4ichigo42020%

エスケープ文字を変更して、希望通りの結果が得られています。

ESCAPE演算子でエスケープ文字を、「\」に変更して、MySQLと同じように使用することもできます。

まとめ

  • 「%」「_」の特殊文字を検索文字列として扱う場合には、エスケープする文字を「[]」で挟むように記載する
  • ESCAPE演算子で、デフォルトのエスケープ文字「[]」を変更することが可能
タイトルとURLをコピーしました