ใช้สัญลักษณ์ตัวแทน“ like” ในคำสั่งที่เตรียมไว้


176

ฉันใช้คำสั่งที่เตรียมไว้เพื่อดำเนินการค้นหาฐานข้อมูล 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();

คำตอบ:


281

คุณจำเป็นต้องตั้งค่าเป็นค่าเองไม่ใช่ในสตริง 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 + "%");

18
+1 OP สามารถ "ตั้งค่า" ใน SQL - ตาม... LIKE '%' || ? || '%'หรือคล้ายกัน - แต่มันมีความยืดหยุ่นน้อยกว่ามาก
pilcrow

ฉันจะทำอย่างไรกับโหมดตรวจจับแบบไม่ใช้ตัวเลือก :)
อัลฟากาเบรียลโวลต์ Timbol

2
ไม่สนใจขนาดตัวพิมพ์เล็กและใหญ่สามารถใช้งานได้WHERE UPPER(?) LIKE UPPER(?)เมื่อใช้งานpstmt.setString(2, "%" + notes + "%")
Zig

1
@Alain: ขอบคุณ เพียงแค่สงสัยว่าสิ่งนี้จะใช้กับ RDBMS ทั้งหมดที่โลกรับรู้ได้หรือไม่? อาจจะ'%' || ? || '%'เป็นที่กล่าวถึงในความคิดเห็นที่ 1 ดีกว่าหลังจากทั้งหมด? ตอนนี้ฉันไม่มีโอกาสได้ทดลอง
BalusC

2
@ BalusC สิ่งนี้ใช้กับ MSSQL, Postgres และ MySQL ในการทดสอบของฉัน String ที่ถูกทำให้เป็นพารามิเตอร์นั้นถูกตีความว่าเป็นการผสมผสานของข้อมูลและคำสั่งการควบคุม การต่อข้อมูล SQL เกิดขึ้นก่อนที่จะถูกตีความและรักษาช่องโหว่ มาตรฐาน IEEE ศูนย์รักษาความปลอดภัยการออกแบบกล่าวว่าการแยกอย่างเคร่งครัดข้อมูลและการควบคุมคำแนะนำและคำแนะนำในการควบคุมกระบวนการไม่เคยได้รับจากแหล่งที่ไม่น่าเชื่อถือ
Alain O'Dea

28

รหัสเช่นนี้

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

ตรวจสอบให้แน่ใจว่าคุณไม่ได้ใส่เครื่องหมายอัญประกาศ '' ด้านล่างเนื่องจากจะทำให้เกิดข้อยกเว้น

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

1
แม้ว่าดูเหมือนว่าบางคนจะไม่พบข้อสันนิษฐานนี้ แต่จริงๆแล้วมันถูกต้องมากโดยเฉพาะเมื่อทำงานกับ Oracle ขอบคุณสำหรับการชี้!
asgs

5

เราสามารถทำสิ่งนี้ได้ง่าย ๆ โดยใช้ฟังก์ชัน CONCATE SQL

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

นี่เป็นงานที่สมบูรณ์แบบสำหรับกรณีของฉัน


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

ลองใช้ดู



-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

มันไม่ปลอดภัยกรุณาใช้คำสั่งที่เตรียมไว้ล่วงหน้า
Durgesh Kumar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.