2008-12-02 10 views
5

मैं अपने दस्तावेज़ संग्रह प्रणाली पर एक उन्नत खोज पृष्ठ के लिए एक प्रश्न लिखने की कोशिश कर रहा हूं। मैं कई वैकल्पिक पैरामीटर द्वारा खोज करने का प्रयास कर रहा हूं। मेरे पास लगभग 5 पैरामीटर हैं जो रिक्त स्ट्रिंग या सर्च स्ट्रिंग्स हो सकते हैं। मुझे पता है कि मुझे प्रत्येक को एक स्ट्रिंग या खाली के रूप में जांचना नहीं चाहिए और प्रत्येक संयोजन के लिए एक अलग संग्रहीत प्रक्रिया तैयार नहीं करनी चाहिए।एकाधिक वैकल्पिक पैरामीटर के लिए एसक्यूएल खोज क्वेरी

संपादित करें:

ISNULL(COALESCE(@var, a.col), '') = ISNULL(a.col, '') 
+0

यह भी देखें: http://stackoverflow.com/questions/532468/ignoring-a-null-parameter-in-t-sql/532510#532510 –

उत्तर

8

आप COALESCE (या IsNull) इसलिए की तरह इस्तेमाल कर सकते हैं:

WHERE COALESCE(@var1, col1) = col1 
AND COALESCE(@var2, col2) = col2 
AND COALESCE(@var3, col3) = col3 
+2

यह समाधान काम नहीं करेगा यदि कॉलम मान न्यूल है क्योंकि आप इस तरह से परीक्षण नहीं कर सकते हैं। यदि मान शून्य है, तो पंक्ति फ़िल्टर की जाएगी। यह वही नहीं है जो आप चाहते हैं। –

+0

फ़ंक्शन कॉल जहां स्थित स्थिति प्रदर्शन को धीमा कर देगी। Coalesce फ़ंक्शन का उपयोग करने के बजाय इसे कॉल करें, जहां (@ var1 शून्य या col1 = @ var1 है) –

1

आप रख सकते हैं या अपने कहां तो जैसे खंड में की:

WHERE 
    (@var1 = '' OR col1 = @var1) AND 
    (@var2 = '' OR col1 = @var2) AND 
    (@var3 = '' OR col1 = @var3) ... 
+0

हालांकि यह समाधान काम करेगा, यह अविश्वसनीय रूप से महंगा है। या इसका उपयोग न करें ... इसके बजाय ISNULL (ऊपर उदाहरण) का उपयोग करें। –

+2

यह समाधान सभी मामलों में काम करेगा। IsNull/Coalesce समाधान केवल नियंत्रित परिस्थितियों में काम करेगा। जब आप कोलेसेस का उपयोग करते हैं, तो आप अभी भी एक कॉलम के लिए एक मूल्य के लिए परीक्षण कर रहे हैं। यदि कॉलम में मान शून्य है, तो यह समान नहीं होगा और पंक्ति वापस नहीं की जाएगी। –

0

आप एक संग्रहीत प्रक्रिया के लिए वैकल्पिक पैरामीटर पारित कर सकते हैं लेकिन अनुकूलक का निर्माण करेगा का उपयोग कर समाप्त उस प्रक्रिया में आपके द्वारा किए गए विशिष्ट कॉल के आधार पर एक योजना। एसक्यूएल सर्वर 2005 में कुछ चालें हैं और बाद में इस से बचने के लिए (पैरामीटर स्नीफिंग, 'कंपाइल' संकेत, इत्यादि के साथ)

यहां तक ​​कि, मैं क्वेरी के मूल के साथ एक दृश्य बनाना पसंद करता हूं और फिर विशिष्ट पैरामीटर के साथ कई procs में उस दृश्य का उपयोग करें। इससे एसक्यूएल को ऑप्टिमाइज़ करने की इजाजत मिलती है क्योंकि यह चाहता है/चाहिए और मैं अभी भी क्वेरी विनिर्देशों को मजबूत करना चाहता हूं।

0

भी अच्छी बात है पैरामीटर वैकल्पिक शून्य और कहां खंड सिर्फ रिक्त स्ट्रिंग मामले की तरह में फिर परीक्षण बनाने के लिए ...

6

मैं आमतौर पर ऐसा करते हैं: पी

WHERE (@var1 IS NULL OR col1 = @var1) 
AND (@var2 IS NULL OR col2 = @var2) 

...

1

एक वैकल्पिक गतिशील करने के लिए है सहयोगी ने संग्रहीत प्रक्रिया में एसक्यूएल का निर्माण किया, यह क्वेरी के लिए सबसे अच्छी संभव योजना तैयार करता है और एक योजना बनाई जाएगी और वैसे भी उपयोग की जाएगी (2005 और ऊपर)।

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