My Photo

« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »

February 19, 2012

PreparedStatementでワイルドカードを使うときの注意

PreparedStatement でワイルドカードを含んだ

SELECT * FROM ACCOUNT WHERE NAME LIKE '<入力値>%'

というSQLを実行しようと思い、

String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE '?%'";

PreparedStatement ps =  connection.prepareStatement(sql);
ps.setString(1, keyword);
ResultSet rs =  ps.executeQuery();

として実行したら以下のようなエラーが出た。

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

?はシングルクウォートで囲ってしまうとプレースホルダとしては機能しなくなるそうだ。
正しくは以下のどちらかのようにすればいいらしい。

String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE ? || '%'";

PreparedStatement ps =  connection.prepareStatement(sql);
ps.setString(1, keyword);
ResultSet rs =  ps.executeQuery();
String sql = "SELECT * FROM ACCOUNT WHERE NAME LIKE ?";

PreparedStatement ps =  connection.prepareStatement(sql);
ps.setString(1, keyword + "%");
ResultSet rs =  ps.executeQuery();

実際に試すと後者はうまくいくが前者はダメだった。
MySQLの問題?

参考ページ:
Java: PreparedStatement で like を扱う時の注意点 - sardineの日記
PreparedStatementのLIKE条件 | MOYO Laboratory

« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »

Java」カテゴリの記事

MySQL」カテゴリの記事

Comments

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference PreparedStatementでワイルドカードを使うときの注意:

« サーブレット・JSPメモ011:DB接続するWEBアプリでリロード時に致命的なエラーが出る | Main | log4jの導入 »

June 2021
Sun Mon Tue Wed Thu Fri Sat
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      
無料ブログはココログ

日本blog村

  • にほんブログ村 IT技術ブログへ
  • にほんブログ村 アニメブログへ
  • にほんブログ村 サッカーブログ アルビレックス新潟へ

好きな音楽家

メモ

XI-Prof