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();

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 + "%");

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 + "%'");

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.


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

Coba ini.


1
String fname = "Sam\u0025";

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

ps.setString(1, fname);

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

itu tidak aman, silakan gunakan pernyataan disiapkan parametrized.
Durgesh Kumar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.