Monday, September 03, 2007

JDBC で SQL の LIKE 文を使うときの書き方

次のように書く。

String keyword = "富";
PreparedStatement st = con.prepareStatement("SELECT name FROM tbl_names WHERE name LIKE ?");
st.setString(1, "%" + keyword);

これにより、富、という文字で始まる名前が検索できる。つまり、LIKE 演算子に使う % や _ などのワイルドカードも含めた検索文字列を setString メソッドで、? にセットするということだ。

ではワイルドカードをエスケープするときは、どうするか?Oracle ではエスケープ文字は特に決まっておらず、ESCAPE オプションで指定する。たとえば、

SELECT id FROM tbl_names WHERE id LIKE '\%%' escape '\';

という SQL 文は、\ をエスケープ文字に指定しており、% という文字で始まる id を検索している。もし、\ がなかったなら、すべての id がヒットする。

JDBC の場合も同様にすればよい。

PreparedStatement st = con.prepareStatement("SELECT id FROM tbl_names WHERE id LIKE ? escape '\\' ");
st.setString(1, "\\%%");

こうすれば、% で始まる id を検索できる。念のため言っておくと、\\ のように二重になっているのは、Java の文字列中では \ はエスケープ文字であるため、二重にすることで \ そのものを表現している。

ただ、このエスケープ文字の指定は Oracle 固有であるので、違う RDBMS では通用しないかもしれない。そこで、JDBC はエスケープ構文が用意している。次のように書く。

PreparedStatement st = con.prepareStatement("SELECT id FROM tbl_names WHERE id LIKE ? escape {'\\'} ");
st.setString(1, "\\%%");

結局、Oracle との違いは、エスケープ文字を {} で囲っていることだけだ。


Oracle、PostgreSQL 等でこれを実験してみる。
そして
http://www.nilab.info/zurazure2/000740.html
このページも参考にしながら、続きを書く。

No comments: