Menggunakan wildcard "suka" dalam pernyataan yang disiapkan

176

Saya menggunakan pernyataan yang disiapkan untuk mengeksekusi query database mysql. Dan saya ingin menerapkan fungsi pencarian berdasarkan kata kunci.

Untuk itu saya perlu menggunakan LIKEkata kunci, yang banyak saya tahu. Dan saya juga telah menggunakan pernyataan yang sudah disiapkan sebelumnya, tetapi saya tidak tahu bagaimana menggunakannya dengan LIKEkarena dari kode berikut di mana saya akan menambahkan 'keyword%'?

Bisakah saya langsung menggunakannya di pstmt.setString(1, notes)as (1, notes+"%")atau sesuatu seperti itu. Saya melihat banyak posting di web ini tetapi tidak ada jawaban yang baik di mana pun.

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

Jawaban:

281

Anda perlu mengaturnya dalam nilai itu sendiri, bukan dalam pernyataan SQL string yang disiapkan.

Jadi, ini harus dilakukan untuk pertandingan awalan:

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

atau pertandingan sufiks:

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

atau pertandingan global:

pstmt.setString(1, "%" + notes + "%");
BalusC
sumber
18
+1 OP dapat "mengatur" dalam SQL - seperti ... LIKE '%' || ? || '%'atau mirip - tapi itu jauh kurang fleksibel.
pilcrow
bagaimana cara melakukannya dengan mode SENSITIF NON-CASE? :)
Alpha Gabriel V. Timbol
2
Non-case-sensitive masih dapat digunakan WHERE UPPER(?) LIKE UPPER(?)saat menggunakanpstmt.setString(2, "%" + notes + "%")
Zig
1
@Alain: Terima kasih. Hanya ingin tahu, apakah ini berlaku untuk semua RDBMS yang dunia ketahui? Mungkin '%' || ? || '%'seperti yang disebutkan dalam komentar 1 lebih baik, setelah semua? Saya tidak memiliki kesempatan untuk bereksperimen sekarang.
BalusC
2
@BalusC ini berlaku untuk MSSQL, Postgres, dan MySQL dalam pengujian saya. String yang dibuat menjadi parameter itu sendiri ditafsirkan sebagai campuran data dan instruksi kontrol. Rangkaian SQL terjadi sebelum ditafsirkan dan menjaga kerentanan. Pusat IEEE untuk Desain Aman mengatakan untuk Memisahkan Data dan Instruksi Kontrol dengan Ketat, dan Tidak Pernah Memproses Instruksi Kontrol yang Diterima dari Sumber yang Tidak Dipercaya .
Alain O'Dea
28

Kode seperti ini:

PreparedStatement pstmt = con.prepareStatement(
    "SELECT * FROM analysis WHERE notes like ?");
pstmt.setString(1, notes + "%");`

Pastikan Anda TIDAK menyertakan tanda kutip '' seperti di bawah karena akan menyebabkan pengecualian.

pstmt.setString(1,"'%"+ notes + "%'");
Serigala Pernikahan
sumber
1
Meskipun sepertinya seseorang tidak akan menerima asumsi ini, itu sebenarnya sangat valid terutama ketika bekerja dengan Oracle. Terima kasih telah menunjukkan!
asgs
5

kita dapat dengan mudah melakukan ini, dengan menggunakan fungsi CONCATE SQL.

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

ini berfungsi dengan baik untuk kasus saya.

Basharat Ali
sumber
4
PreparedStatement ps = cn.prepareStatement("Select * from Users where User_FirstName LIKE ?");
ps.setString(1, name + '%');

Coba ini.

Faiz
sumber
1
String fname = "Sam\u0025";

PreparedStatement ps= conn.prepareStatement("SELECT * FROM Users WHERE User_FirstName LIKE ? ");

ps.setString(1, fname);
Ram Kumar
sumber
2
Bisakah Anda menguraikan jawabannya daripada hanya memberikan jawaban? Lihat: stackoverflow.com/help/how-to-answer
Edwin
-13
String query="select * from test1 where "+selected+" like '%"+SelectedStr+"%';";


PreparedStatement preparedStatement=con.prepareStatement(query);


// where seleced and SelectedStr are String Variables in my program
mahesh dhote
sumber
itu tidak aman, silakan gunakan pernyataan disiapkan parametrized.
Durgesh Kumar