tyoshikawa1106のブログ

- Force.com Developer Blog -

SFDC:SOQLのLIKE検索で押さえておきたいポイント

SOQLのLIKE検索をする時の処理はだいたいこんな感じの処理を書くと思います。

f:id:tyoshikawa1106:20140826224257p:plain


String.escapeSingleQuotesも使用してSOQLインジェクション対策もできています。
ですが...この書き方には落とし穴がありました。


検索条件に「あいう%%%えお」というように指定したとします。このときの3つの「%」は本来検索文字列として扱われるべきなのですが、LIKE検索用の「%」と同じ扱いとされてしまいます。


この場合、「あいう」までが検索条件として扱われ、後ろに「%」が付くことで前方一致検索と判定されてしまいます。

f:id:tyoshikawa1106:20140826225128p:plain


この問題は次の2つの対応で解決できるみたいです。

  • 「.replace('%', '\\%')」のように「%」を置換する
  • 「LIKE: searchKey」のようにバインド変数を使う


まず、検索文字列の「%」を「'\\%'」に置換することでLIKEの「%」と区別できます。そして、「'\\%'」に置換するため「escapeSingleQuotes」を使ってしまうと「'\\%'」が検索文字列としてそのまま使われてしまいます。バインド変数で対応することで「'\\%'」として宣言したまま、クエリ時には「%」で検索できるようになります。

※バインド変数はSOQLインジェクションの対策を自動でやってくれます。

f:id:tyoshikawa1106:20140826231306p:plain


これで「あいう%%%えお」のような条件で検索できるようになります。

f:id:tyoshikawa1106:20140826231429p:plain


検索対象に「%」が含まれることは稀なケースだと思いますが、この2つの対応で簡単に解決できるみたいなのでLIKE検索を実装するときには押さえて方がいいと思います。


今回の検証用に用意したサンプルコードはこちらです。