तैयार स्टेटमेंट में "लाइक" वाइल्डकार्ड का उपयोग करना


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 ओपी इसे एसक्यूएल में "सेट" कर सकता है - जैसा ... LIKE '%' || ? || '%'या इससे भी कम - लेकिन यह बहुत कम लचीला है।
तीर्थयात्रा

मैं इसे गैर-संवेदनशील मोड के साथ कैसे करूं? :)
अल्फा गैब्रियल वी। टिम्बोल

2
गैर-केस-संवेदी उपयोग करते WHERE UPPER(?) LIKE UPPER(?)समय अभी भी उपयोग कर सकते हैंpstmt.setString(2, "%" + notes + "%")
जिग

1
@Alain: धन्यवाद। जरा सोचकर, क्या यह सभी RDBMS पर लागू होता है, जिसके बारे में दुनिया को पता है? शायद '%' || ? || '%'जैसा कि 1 टिप्पणी में उल्लेख किया गया था, बेहतर था, आखिर? मेरे पास अभी प्रयोग करने का अवसर नहीं है।
बालुसक

2
@BalusC यह मेरे परीक्षण में MSSQL, Postgres, और MySQL पर लागू होता है। स्ट्रिंग को एक पैरामीटर में बनाया जा रहा है और इसे डेटा और नियंत्रण निर्देशों के मिश्रण के रूप में व्याख्या की जाती है। एसक्यूएल कॉन्फिनेशन व्याख्या करने से पहले होता है और भेद्यता को संरक्षित करता है। IEEE सेंटर फ़ॉर सिक्योर डिज़ाइन, स्ट्रिक्टली सेपरेट डेटा और कंट्रोल इंस्ट्रक्शन्स को कहता है , और अनट्राइल्ड सोर्सेज से कभी भी प्रोसेस कंट्रोल इंस्ट्रक्शन्स नहीं मिलता है
Alain O'Dea

28

इसे इस तरह से कोड करें:

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

सुनिश्चित करें कि आप नीचे दिए गए उद्धरणों को शामिल नहीं करेंगे क्योंकि वे अपवाद का कारण बनेंगे।

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

1
हालांकि ऐसा लगता है कि कोई इस धारणा में नहीं चलेगा, यह वास्तव में बहुत ही मान्य है, खासकर ओरेकल के साथ काम करते समय। इशारा करने के लिए धन्यवाद!
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

यह असुरक्षित है, कृपया पैराट्राइज्ड रेडीएटमेंट का उपयोग करें।
दुर्गेश कुमार
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.