LIKE演算子でパターマッチする時に、特殊文字「%」「_」を単なる文字として検索をしたい!!!
LIKE演算子で検索を行う際に、「%」「_」の特殊文字は特別な意味を持ち、これそのままでは文字列として扱うことはできませんが、この2つの文字を検索文字列として使用する場合に「\」を使用してエスケープ処理をすることで、文字列として扱うことができるようになります。
エスケープ処理で使用される「\」も、また同じ「\」でエスケープ処理することができます。
また、エスケープ処理に使われる文字は、「\」がデフォルトですが、ESCAPE演算子を使用することで、エスケープ処理の文字を変更することができます。
SQLServerではエスケープの方法が「\」ではなく「[]」になりますので、注意が必要です。 SQLServer使用の方は、下記の記事を参考にしてみてください。
特殊文字「%」「_」と「\」をエスケープする
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 '%_%'
;
【実行結果】
id | name | address |
---|---|---|
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 '%\\_%'
;
【実行結果】
id | name | address |
---|---|---|
1 | Aoki | Aomori_aomori |
2 | Akiyama | Akita_akita |
4 | Yamada | Yamagata_yamagata |
6 | Fukuda | Fukushima_fukushima |
無事に「_」を含むデータのみを抽出することができました。
ESCAPE演算子でエスケープ処理のデフォルト文字を変更する
エスケープ文字は通常デフォルトで「\」ですが、ESCAPE演算子を使うことで、この文字を変更することが可能です。
ちなみに、ESCAPE演算子はSQLServerでも同じように使用することができます。
それでは、下記のテーブルとデータを準備して検証してみましょう。
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 '#'
;
【実行結果】
id | name | price | discount |
---|---|---|---|
1 | ringo | 230 | 10% |
2 | mikan | 130 | 5% |
4 | ichigo | 420 | 20% |
エスケープ文字を変更して、希望通りの結果が得られています。
極端な話ですが、ESCAPE演算子でエスケープ文字を、「a」「あ」などの文字にすることも可能です。 普通はやらないので覚えなくていいですが…
まとめ
- 「%」「_」の特殊文字を検索文字列として扱う場合には、エスケープする文字の前に「\」を記載する
- ESCAPE演算子で、デフォルトのエスケープ文字「\」を変更することが可能