Hazırlanan ifadede "like" joker karakterini kullanma


176

MySQL veritabanı sorguları yürütmek için hazırlanan ifadeler kullanıyorum. Ve bir tür anahtar kelimeye dayalı bir arama işlevselliği uygulamak istiyorum.

Bunun için LIKEanahtar kelimeyi kullanmam lazım , biliyorum. Ve ben de daha önce hazırlanmış ifadeler kullandık, ama nasıl kullanılacağını bilmiyorum LIKEçünkü aşağıdaki koddan nereye ekleyeceğim 'keyword%'?

Doğrudan pstmt.setString(1, notes)as (1, notes+"%")ya da bunun gibi bir şeyde kullanabilir miyim . Web üzerinde bu kadar çok yazı görüyorum ama hiçbir yerde iyi bir cevap yok.

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

Yanıtlar:


281

Hazırlanan deyim SQL dizesinde değil, değerin kendisinde ayarlamanız gerekir.

Öyleyse, bu bir önek eşleşmesi için yapılmalıdır:

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

veya bir sonek eşleşmesi:

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

veya global bir maç:

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

18
+1 OP, SQL'de " ... LIKE '%' || ? || '%'veya benzeri " olarak "ayarlayabilir", ancak bu çok daha az esnektir.
19'da pilcrow

DURUMSUZ DUYARLI mod ile nasıl yapabilirim? :)
Alpha Gabriel V. Timbol

2
Büyük / küçük harfe duyarlı olmayan kullanım için hala WHERE UPPER(?) LIKE UPPER(?)kullanılabilirpstmt.setString(2, "%" + notes + "%")
Zig

1
@Alain: Teşekkürler. Sadece merak ediyorum, bu dünyanın bildiği tüm RDBMS için geçerli mi? Belki '%' || ? || '%'de 1 yorumda belirtildiği gibi, sonuçta daha iyiydi? Şu anda deneme yapma fırsatım yok.
BalusC

2
@BalusC bu benim test MSSQL, Postgres ve MySQL için geçerlidir. Bir parametreye yapılan String, veri ve kontrol talimatlarının bir karışımı olarak yorumlanır. SQL birleşimi, yorumlanmadan ve güvenlik açığını korumasından önce gerçekleşir. IEEE Güvenli Tasarım Merkezi, Verileri ve Kontrol Talimatlarını Kesinlikle Ayırdığını ve Güvenilmeyen Kaynaklardan Alınan Kontrol Talimatlarını Asla İşlemediğini söylüyor .
Alain O'Dea

28

Bu şekilde kodlayın:

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

İstisnaya neden olacağından, aşağıdaki gibi tırnak işaretlerini İÇERMEDİĞİNİZDEN emin olun .

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

1
Birisi bu varsayımla karşılaşmayacak gibi görünse de, özellikle Oracle ile çalışırken çok geçerli. İşaret ettiğiniz için teşekkürler!
2015'te

5

CONCATE SQL işlevini kullanarak bunu basit bir şekilde yapabiliriz.

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

bu benim durumum için mükemmel bir iş.


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

Bunu deneyin.



-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

güvenli değildir, lütfen parametreli hazırlıkları kullanın.
Durgesh Kumar
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.