2010-04-25 19 views
26

क्वेरी को अनदेखा करते हैं क्वेरी को चलाने का सबसे अच्छा तरीका क्या है ताकि फ़ील्ड में रिक्त स्थान अनदेखा हो? उदाहरण के लिए, निम्नलिखित प्रश्न:रिक्त स्थान जो

SELECT * FROM mytable WHERE username = "JohnBobJones"  
SELECT * FROM mytable WHERE username = "John Bob Jones" 

निम्नलिखित प्रविष्टियों मिलेगा:

John Bob Jones 
JohnBob Jones 
JohnBobJones 

मैं php या अजगर का उपयोग कर रहा है, लेकिन मुझे लगता है कि यह कोई फर्क नहीं पड़ता।

+1

PostgreSQL या MySQL? प्रत्येक मामले में सबसे अच्छा समाधान अलग हो सकता है। दोनों में काम करने वाली कुछ लिखने की कोशिश करना आमतौर पर एक धीमी क्वेरी के लिए एक नुस्खा है। –

उत्तर

54
SELECT * FROM mytable 
    WHERE REPLACE(username, ' ', '') = REPLACE("John Bob Jones", ' ', '') 
+0

फायरबर्ड 2.5 में भी पूरी तरह से काम करता है। – lordvlad

+0

आप LIKE ऑपरेटरों और वाइल्डकार्ड के साथ REPLACE() फ़ंक्शन का भी उपयोग कर सकते हैं। उदाहरण के लिए: चयन करें * mytable REPLACE से (उपयोगकर्ता नाम, '', '') जैसे स्थान ("जॉन बी%", '', ''); –

-1

एक तरीका आपके प्रश्नपत्र बनाने के लिए LIKE और WildCards का उपयोग करना होगा। कुछ ऐसा:

चयन करें * mytable से जहां उपयोगकर्ता नाम 'जॉन बॉब जोन्स' चुनें;

+15

यह गलत तरीके से 'जॉन पॉल बॉब जोन्स' से मेल खाता है। – SLaks

+0

यह उत्तर गलत है। –

10

यह निर्भर करता है। यदि आपको अच्छे प्रदर्शन की परवाह नहीं है तो आप बहुत सी चीजें कर सकते हैं लेकिन उनमें से अधिकतर धीमे हो जाएंगे। हो सकता है कि यह आपके लिए ठीक है, लेकिन अगर मैं पढ़ रहा हूं तो मैं यह जवाब यहां छोड़ दूंगा।

यदि आप बहुत तेज प्रदर्शन चाहते हैं तो आपको डेटाबेस में रिक्त स्थान के बिना स्ट्रिंग को इंडेक्स करना चाहिए। PostgreSQL में आप create an index on a function कर सकते हैं। आप रिक्त स्ट्रिंग के साथ रिक्त स्थान के साथ कॉलम पर एक अनुक्रमणिका बनाने के लिए इसका उपयोग कर सकते हैं। इस विधि का लाभ यह है कि इसे इंडेक्स बनाने के अलावा कोई रखरखाव की आवश्यकता नहीं है।

MySQL में आप ऐसा नहीं कर सकते हैं इसलिए डेटाबेस में डेटा को डुप्लिकेट करना सबसे आसान तरीका होगा - एक बार रिक्त स्थान और बिना किसी के। अपने WHERE खंड में रिक्त स्थान के बिना कॉलम का उपयोग करें, लेकिन अपनी चयन कॉलम सूची में मूल कॉलम का उपयोग करें। इसके लिए अधिक रखरखाव की आवश्यकता है क्योंकि कॉलम को सिंक में रखा जाना चाहिए। आप इसे एप्लिकेशन तर्क या डेटाबेस ट्रिगर्स के साथ कर सकते हैं।

+0

अच्छा बिंदु, मैंने अभी पोस्टकोड खोज और वाह में mySQL REPLACE की कोशिश की है ... यह धीमा है ... टिप के लिए धन्यवाद! – Ford

1

इस कोशिश:

SELECT * FROM mytable WHERE username =REPLACE("John Bob Jones", ' ', '') 
+0

'जॉनबॉट जोन्स' ढूंढने में असफल रहेगा – Alan

2

प्रस्तावित समाधान बहुत अच्छी तरह से लग रही है लेकिन अगर यह संभव है से mytable तरह

चुनें * कुछ के साथ क्वेरी को प्रतिबंधित, प्रदर्शन के लिए भयानक है जहां 'जॉन की तरह उपयोगकर्ता नाम % 'और स्थान (उपयोगकर्ता नाम,' ',' ') = REPLACE ("जॉन बॉब जोन्स",' ',' ')

इसके अलावा आप REGEXP का उपयोग कर सकते हैं।

चुनें * से mytable कहां उपयोगकर्ता नाम regexp '^ जॉन * बॉब * जोन्स

और प्रदर्शन याद है, जहां में ऑपरेशन सामान्य बुरा विचार कर रहे हैं।

-http://dev.mysql.com/doc/refman/5.7/en/pattern-matching.html

0

हम अक्सर पाठ के लिए खोज करने के लिए, रिक्त स्थान, सफेद स्थान और पत्रों की संख्या की परवाह किए बिना चाहते हैं एक नजर डालें।

बस एक स्थान के लिए सभी मल्टी गैर-शब्द वर्णों को ट्रिम करें, कम करें, और प्रतिस्थापित करें।

SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 

वापसी: यहाँ कई सफेद रिक्त स्थान और अलग चरित्र संवेदनशील

के साथ एक लंबी पाठ यहाँ खोज के लिए उपयोग है। केवल शब्दों का क्रम महत्वपूर्ण है, और कुछ नहीं.और यह सुंदर है।

select * from (
SELECT regexp_replace(trim(lower('Here is    a   long    text    , with   many     white spaces   AND    different     character    sensitive')),'\W+',' ','g') t 
) as o 
where t= regexp_replace(trim(lower('Here is a LonG  TEXT , with   mANY white ^ spaces   AND   different character    sensiTive')),'\W+',' ','g') 

वापसी: यहाँ कई सफेद रिक्त स्थान और अलग चरित्र संवेदनशील क्वेरी में डेटा में

कचरा और कबाड़ के साथ एक लंबी पाठ है, लेकिन यह अभी भी यह सही पाता है।

संबंधित मुद्दे