SQLのLIKE条件に指定する文字列に含まれる%や_のエスケープ

SQLで文字列の曖昧検索をする場合はLIKEキーワードを使用する。

sqlite> SELECT NAME FROM PERSON WHERE NAME LIKE '%太郎'
Q太郎
小太郎
鬼太郎
キャベツ四太郎
100%太郎

 

では、「%」の文字そのものを含んだ曖昧検索をしたい場合はどうすればいいか?

→ ESCAPEキーワードを使う。

 

と、いうわけで、今回は、ESCAPEキーワードの使い方について、さらっとご紹介する。

(今回の確認環境として、データベースエンジンはSQLite3を使用したが、MySQL等、他のSQLでも適用可能。)

ESCAPEキーワードを使ったSQLの構文

SELECT カラム名 FROM テーブル名 WHERE カラム名 LIKE 検索文字列 ESCAPE エスケープ文字;

 

これを使って%や_などの、LIKEキーワードに対してのワイルドカード文字をエスケープして検索するSQLは次のようになる。

sqlite> SELECT NAME FROM PERSON WHERE NAME LIKE '100!%太郎' ESCAPE '!';
100%太郎

一歩進んだESCAPEキーワードの使い方

ESCAPEにはどんな文字でも使えるし、WHERE句のAND結合ごとに異なる文字も使える。

sqlite> SELECT NAME FROM PERSON WHERE NAME LIKE '100!%太郎' ESCAPE '!' AND NAME LIKE '100@%太郎' ESCAPE '@';
100%太郎

Ruby on RailsでもLIKE検索はSQLを意識する必要がある

Ruby on Railsに興味が無い人には申し訳ないが、突然話題はRuby on Railsに変わる。

今回の記事を書くきっかけは、Ruby on Railsで、LIKE検索で%や_などのワイルドカード文字を適切にエスケープしてくれる方法が無いものかと探していたら、LIKE条件はSQLを書かないとダメという結論になったためだったりする。

 

 

ActiveRecord::Relation#whereを呼び出した検索条件は、andで結合されていくが、SQLのESCAPEキーワードはand条件それぞれで定義できるため、この書き方で問題無さそうだ。

 

参考にしたページ→a proper way to escape %% when building LIKE queries in Rails 3 / ActiveRecord

コメントを残す

トラックバック: http://pgnote.net/wp-trackback.php?p=1098