2010-12-02 11 views
9

मेरे पास स्थान के नामों की एक सूची है और एसक्यूएल डेटाबेस में रिकॉर्ड्स से मिलान करना चाहते हैं, समस्या यह है कि गुणों के नाम के बाद संदर्भ संख्याएं हैं। जैसे। 'बालीमेना पी 4sdf5g' यह संभव में इस्तेमाल करते हैं और रिकॉर्डक्या कहीं भी स्टेटमेंट के लिए LIKE और IN का उपयोग करना संभव है?

WHERE dbo.[Places].[Name] IN LIKE('Ballymena%','Banger%') 

उत्तर

8

यह एक आम धारणा है कि निर्माण के लिए

b IN (x, y, z) 

कि (x, y, z) एक सेट का प्रतिनिधित्व करता है। ऐसा नहीं होता। तालिका:

दरअसल, यह

(b = x OR b = y OR b = z) 

एसक्यूएल है, लेकिन एक डेटा संरचना के लिए केवल वाक्यात्मक चीनी है। यदि आप एक खोज के रूप में खोज टेक्स्ट मानों से पूछना चाहते हैं तो उन्हें एक टेबल में रखें। JOINJOIN स्थिति में LIKE का उपयोग करके आप अपनी Places तालिका में अपनी खोज टेक्स्ट तालिका JOIN कर सकते हैं उदा।

WITH Places (Name) 
    AS 
    (
     SELECT Name 
     FROM (
       VALUES ('Ballymeade Country Club'), 
        ('Ballymena Candles'), 
        ('Bangers & Mash Cafe'), 
        ('Bangebis') 
      ) AS Places (Name) 
    ), 
    SearchText (search_text) 
    AS 
    (
     SELECT search_text 
     FROM (
       VALUES ('Ballymena'), 
        ('Banger') 
      ) AS SearchText (search_text) 
    ) 
SELECT * 
    FROM Places AS P1 
     LEFT OUTER JOIN SearchText AS S1 
      ON P1.Name LIKE S1.search_text + '%'; 
12

कोई मिलान करने के लिए पसंद करने के लिए है, लेकिन आप के बजाय का उपयोग कर सकते या: अच्छी तरह से एक सरल उपाय नियमित अभिव्यक्ति का उपयोग करेंगे

WHERE (dbo.[Places].[Name] LIKE 'Ballymena%' OR 
     dbo.[Places].[Name] LIKE 'Banger%') 
2

यकीन नहीं है कि यह कैसे इस

WHERE dbo.[Places].[Name] SIMILAR TO '(Banger|Ballymena)'; 

या

को एसक्यूएल लेकिन शायद कुछ समान में किया है
WHERE dbo.[Places].[Name] REGEXP_LIKE(dbo.[Places].[Name],'(Banger|Ballymena)'); 

उनमें से एक कम से कम

+0

वास्तव में काम कर सकता है, लेकिन regex समर्थन मानक एसक्यूएल नहीं है .. –

+0

इसी तरह के बारे में क्या है? माना जाता है कि – Breezer

+0

'समान' को मानक में 'regexp_like' के साथ प्रतिस्थापित किया जा रहा है। हम देखेंगे। – Donnie

1

आप इस्तेमाल कर सकते हैं काम करना चाहिए या

WHERE 
    dbo.[Places].[Name] LIKE 'Ballymena%' 
    OR dbo.[Places].[Name] LIKE 'Banger%' 

या अंतरिक्ष में स्ट्रिंग विभाजित है, अगर places.name हमेशा एक ही प्रारूप में है।

WHERE SUBSTRING(dbo.[Places].[Name], 1, CHARINDEX(dbo.[Places].[Name], ' ')) 
    IN ('Ballymena', 'Banger') 

यह प्रदर्शन कम हो सकती है क्योंकि डेटाबेस तरह से अनुक्रमित उपयोग करने में सक्षम हो सकता है (यदि वाइल्डकार्ड अंत में है तुम भी एक बेहतर मौका है), लेकिन प्रयोग करने सबसे शायद नहीं जब।

+0

दुर्भाग्यवश कुछ जगहों के नामों में रिक्त स्थान हैं लेकिन कम से कम कोई अच्छा समाधान +1 नहीं है – Euclid

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