2009-03-11 15 views
6

मैं अपने पास संग्रहीत प्रक्रिया में वैकल्पिक पैरामीटर लागू करने की कोशिश कर रहा हूं लेकिन मैं किसी समस्या में भाग रहा हूं। यहाँ मुद्दा वर्णन करने के लिए एक सरल प्रश्न है:WHERE खंड में SQL Coalesce

SET ANSI_NULLS OFF 

DECLARE @MiddleName VARCHAR(20); 
SET @MiddleName = NULL; 

SELECT * FROM [Customer] 
WHERE [LastName] = 'Torres' 
AND [MiddleName] = COALESCE(@MiddleName, [MiddleName]) 

जब मैं इस क्वेरी मैं क्योंकि एक टोरेस [MiddleName] स्तम्भ में व्यर्थ है एक पंक्ति वापस पाने के लिए की जरूरत है चलाते हैं। लेकिन क्वेरी शून्य पंक्तियां लौटाती है। IFNULL() का उपयोग करना एक ही परिणाम उत्पन्न करता है। कोलासेस की खोज से, मैं इस धारणा के तहत था कि सभी अभिव्यक्ति पूर्ण होने पर न्यूल वापस कर दिया जाएगा। चूंकि मैं एक एसक्यूएल विशेषज्ञ नहीं हूं, मुझे लगता है कि मुझे कुछ याद आ रहा है, लेकिन यह क्या है .....

किसी भी मदद के लिए अग्रिम धन्यवाद।

+0

मैं व्याख्या करने के लिए क्या आप सही तरीके से कह रहे हैं कोशिश कर रहा हूँ कुछ तरह की आवश्यकता है ...। मुझे लगता है कि आप निम्नलिखित का मतलब है: आप सभी पंक्तियों को कहने के लिए कोलेसे का उपयोग कैसे करते हैं यदि अन्यथा न केवल उस पंक्ति से पंक्तियां होती हैं। अगर ऐसा है तो मैं क्लॉजसे (@MiddleName, '') = '' या @ MiddleName = [MiddleName] जैसे खंड में कुछ ऐसा करूंगा। और ([MiddleName] = @MiddleName या [MiddleName] रिक्त है) – geoffrobinson

उत्तर

12

समस्या यह है कि एसक्यूएल में, "जहां नल = नल" कभी भी किसी भी पंक्ति को वापस नहीं करेगा क्योंकि नल खुद के बराबर नहीं है।

आप

SELECT * FROM [Customer] 
WHERE [LastName] = 'Torres' 
AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName) 
+2

एक और विकल्प यह है: कोलेसे ([मिडिलनाम], '') = कोलेसे (@MiddleName, [MiddleName], '') –

+0

"@var IS NULL" का उपयोग करके स्थिरता देता है जो अनुकूलक स्थिति को शॉर्टकट करने के लिए उपयोग कर सकता है। जोएल से सुझाए गए "प्रत्येक मध्यनाम के खिलाफ तुलना करने की आवश्यकता होगी। डेविड के उदाहरण में, मध्य नाम की तुलना कभी भी नहीं की जा सकती क्योंकि ऑप्टिमाइज़र सही जानता है या हमेशा सत्य है। – MatBailie

2

क्या आप ऐसा करने की कोशिश कर रहे हैं?

SELECT * FROM [Customer] 
WHERE [LastName] = 'Torres' 
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL) 

जो मैं समझता हूं उससे ऐसा लगता है।

+0

आप कुछ कोष्ठक याद कर रहे हैं? क्यूं कर? – TrevorD

+0

हम्म, यह भी डाल करने के लिए [Middlename] रिक्त है पहले – TrevorD

+0

[Middlename] शून्य पहला है आवश्यकता हो सकती है: – gcores

2

आपका COALESCE रिटर्न NULL करने के लिए जब @MiddleName पैरामीटर और MiddleName स्तंभ दोनों NULL हैं, लेकिन परीक्षण क्योंकि a NULL does not equal any other NULL गलत पर मूल्यांकन करेंगे।

इस समाधान करने के लिए आप स्पष्ट रूप से तुच्छता के लिए @MiddleName पैरामीटर का परीक्षण करना चाहिए:

SELECT * 
FROM [Customer] 
WHERE [LastName] = 'Torres' 
    AND (@MiddleName IS NULL OR [MiddleName] = @MiddleName) 
+0

गलत तरीके से, वह इसे बनाने की कोशिश कर रहा है कि यदि @MiddleName न्यूल है तो इसे प्रभावी ढंग से अनदेखा किया जाता है, जिससे परमटेर छद्म वैकल्पिक – MatBailie

3

आप राज्य आप पंक्ति वापस जाने के लिए जहां क्षेत्र MiddleName शून्य है क्वेरी के लिए देख रहे हैं। दुर्भाग्यवश (NULL = NULL) सच नहीं लौटाता है, यह पूर्ण लौटाता है।

आप

SELECT * FROM [Customer] 
WHERE [LastName] = 'Torres' 
AND ([MiddleName] = @MiddleName OR @MiddleName IS NULL) 
संबंधित मुद्दे