2012-03-29 21 views
5

मैं एक चयन क्वेरी लिखने के लिए उपयोग कर रहा हूं और समान कथन के लिए मान गतिशील है।एसक्यूएल में LIKE कथन में केस असंवेदनशील खोज करना संभव है?

AND  e.rank_request_id = a.request_id 
    AND  f.priority_request_id = a.request_id 
    AND  b.status_type_id = c.status_id 
    AND b.status_request_id = a.request_id 
    AND a.request_id LIKE '%#form.searchbar#%' 

लेकिन यह केवल तभी परिणाम देता है जहां स्ट्रिंग # form.searchbar # में प्रत्येक वर्ण का केस मेल खाता है।

कृपया इसके लिए एक समाधान का सुझाव दें ताकि यह मामला असंवेदनशील हो।

+3

क्या डेटाबेस कुछ होगा आप उपयोग कर रहे? – softarn

+1

कौन सा डीबीएमएस? सिस्टम/भाषा के बावजूद, आपके परीक्षण के दोनों तरफ के आवरण को मजबूर करना अक्सर किया जाता है। –

+1

एसक्यूएल इंजेक्शन के लिए भी देखें। –

उत्तर

17

मैं क्या डेटाबेस का उपयोग कर रहे पता नहीं है, लेकिन अगर यह ओरेकल के लिए थे तो तुम सिर्फ दोनों चीजों के मामले के लिए मजबूर कर सकता है हो सकता है। हालांकि यह निष्पादन के समय की लागत पर आता है क्योंकि यह उस कॉलम के सभी मूल्यों के लिए करता है लेकिन यदि आपके पास बहुत अधिक डेटा है और फ़ंक्शन आधारित इंडेक्स के साथ काम कर सकता है तो आप केवल लागत देखेंगे। तो ओरेकल के लिए कुछ इस तरह, फिर से:

AND UPPER(a.request_id) LIKE '%#UCase(Form.Searchbar)#%' 

लेकिन मैं तुम्हें तो एक queryparam का प्रयोग कर एक उपयोगकर्ता इनपुट बॉक्स से आती दिखायी के बाद से, सुझाव है:

AND UPPER(a.request_id) LIKE <cfqueryparam value="%#UCase(Form.Searchbar)#%" cfsqltype="cf_sql_varchar" /> 
+2

cfqueryparam के लिए +1। –

+0

यदि आप कॉलम में ऊपरी उपयोग करते हैं, तो डेटाबेस उस कॉलम में परिभाषित किए गए इंडेक्स का उपयोग नहीं करेगा, बेटे को एक बड़ी तालिका में बहुत धीमा चल जाएगा। आप ऊपरी फ़ंक्शन वाले इंडेक्स को परिभाषित कर सकते हैं और क्वेरी को उदाहरण की तरह छोड़ सकते हैं और फिर डेटाबेस इंडेक्स का उपयोग करेगा। डेटाबेस द्वारा किए गए निर्णय के लिए हमेशा अपनी अनुक्रमणिका का उपयोग करने के लिए निष्पादन योजना की समीक्षा करें। – Juan

1

आप a.request_id कम और form.searchbar

AND lower(a.request_id) LIKE '%#form.searchbar#%' 
+0

का उपयोग करना यह विफल रहता है अगर '% # form.searchbar #%' टेस्ट या tEst –

+0

जैसा कुछ है, हां, बस पता चला। Form.searchbar को भी कम करने के लिए बताना भूल गया;) – Soader03

2

वहाँ मामले के बारे में पहले से ही कई सवाल कर रहे हैं - असंवेदनशील जहां ओरेकल में खंड:

उदाहरण के लिए, here

इसके अलावा, यह क्वेरी ऐसा लगता है कि यह SQL इंजेक्शन हमलों के लिए कमजोर हो सकता है। अधिक जानकारी here

+0

यह प्रश्न थोड़ा अलग है क्योंकि यह कोल्डफ्यूजन से भी संबंधित है। इसके पहले StackOverflow –

+0

पर दयालु है, मैं समझता हूं, काफी उचित है। एसक्यूएल इंजेक्शन जोखिम के लिए –

+0

+1 –

1

स्निप 6565 सुझाव देता है कि आप सब कुछ अपरकेस पर मजबूर कर सकते हैं। केस-असंवेदनशील खोज करने के लिए आप regexp_instr फ़ंक्शन का भी उपयोग कर सकते हैं। उदाहरण के लिए, हर पंक्ति जहां ENAME एक केस-संवेदी फैशन

SQL> ed 
Wrote file afiedt.buf 

    1 select ename, empno 
    2 from emp 
    3* where regexp_instr(ename, 'in', 1, 1, 1, 'i') > 0 
SQL>/

ENAME   EMPNO 
---------- ---------- 
MARTIN   7654 
KING    7839 

आपके मामले में में 'में' स्ट्रिंग के लिए EMP तालिका में खोज करने, यह शायद की तरह

AND regexp_instr(a.request_id, '#form.searchbar#', 1, 1, 1, 'i') > 0