1. ホーム
  2. java

[解決済み] プリペアドステートメントで "like "ワイルドカードを使用する

2022-04-23 16:39:36

質問

私は、mysqlデータベースのクエリを実行するために準備されたステートメントを使用しています。そして、ある種のキーワードに基づいた検索機能を実装したいのです。

そのためには LIKE というキーワードがあること、それだけは知っています。また、プリペアドステートメントを使ったことがありますが、それを LIKE というのも、以下のコードのどこに 'keyword%' ?

で直接使用することはできますか? pstmt.setString(1, notes) として (1, notes+"%") とか、そんな感じです。ウェブ上でこの件に関する多くの投稿を見ますが、どこにも良い答えがありません。

PreparedStatement pstmt = con.prepareStatement(
      "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes);
ResultSet rs = pstmt.executeQuery();

解決方法は?

プリペアドステートメントのSQL文字列ではなく、値自体に設定する必要があります。

ということは、プレフィックスマッチはこれでいいんですね。

notes = notes
    .replace("!", "!!")
    .replace("%", "!%")
    .replace("_", "!_")
    .replace("[", "![");
PreparedStatement pstmt = con.prepareStatement(
        "SELECT * FROM analysis WHERE notes LIKE ? ESCAPE '!'");
pstmt.setString(1, notes + "%");

またはサフィックスマッチ

pstmt.setString(1, "%" + notes);

またはグローバルにマッチします。

pstmt.setString(1, "%" + notes + "%");