जवाबों:
मुझे बताया गया है कि COALESCE ISNULL की तुलना में कम खर्चीला है, लेकिन शोध से यह संकेत नहीं मिलता है। ISNULL केवल दो मापदंडों को लेता है, NULL के लिए मूल्यांकन किए जाने वाले क्षेत्र और यदि आप चाहते हैं कि इसका मूल्यांकन NULL के रूप में किया जाए। COALESCE किसी भी संख्या में पैरामीटर लेगा, और पहला मान लौटाएगा जो NULL नहीं है।
यहाँ विवरणों का अधिक गहन वर्णन है http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
मुझे यकीन नहीं है कि आपको क्यों लगता है कि दस्तावेज़ अस्पष्ट है।
यह बस एक-एक करके सभी मापदंडों से गुजरता है, और पहले वाला रिटर्न देता है NOT NULL
।
COALESCE(NULL, NULL, NULL, 1, 2, 3)
=> 1
COALESCE(1, 2, 3, 4, 5, NULL)
=> 1
COALESCE(NULL, NULL, NULL, 3, 2, NULL)
=> 3
COALESCE(6, 5, 4, 3, 2, NULL)
=> 6
COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
=> NULL
यह किसी भी संख्या के मापदंडों को बहुत स्वीकार करता है, लेकिन उन्हें समान डेटा-प्रकार होना चाहिए। (यदि वे समान डेटा-प्रकार के नहीं हैं, तो वे डेटा-प्रकार के पूर्व-क्रम के उपयोग से एक उपयुक्त डेटा-प्रकार में निहित हो जाते हैं ।)
यह ISNULL()
सिर्फ दो के बजाय कई मापदंडों के लिए पसंद है ।
यह भी है ANSI-SQL
, जहां के रूप ISNULL()
में नहीं है।
ISNULL
पहले पैरामीटर के रूप में उसी डेटाटाइप के साथ एक मान लौटाता है, हालांकि
expressions
, CASE के साथ तुलना करता है, ISNULL के साथ तुलना करता है, और अंत में कोई परिणाम नहीं के साथ एक उदाहरण है। फिर बहुत अधिक विवरण के साथ एक अत्यधिक जटिल उदाहरण। जब हम सभी की आवश्यकता होती है तो यह जवाब डब्ल्यूटीएफ की 5 - 6 लाइनों के साथ होता है।
यहाँ मैं जिस तरह से COALESCE देख रहा हूँ ... और उम्मीद है कि यह समझ में आता है ...
एक सरलीकृत रूप में…।
कोलेस (फील्डनेम, 'खाली')
तो यह अनुवाद करता है ... यदि "फ़ील्डनाम" NULL है, तो "EMPTY" शब्द के साथ फ़ील्ड मान को पॉप्युलेट करें।
अब म्यूटेंट वैल्यू के लिए ...
कोलेस (फ़ील्डनाम 1, फील्डनेम 2, मान 2, मान 3)
यदि Fieldname1 में मान शून्य है, तो इसे Fieldname2 में मान के साथ भरें, यदि FieldName2 NULL है, तो Value2 के साथ भरें, आदि।
के लिए परीक्षण कोड का यह टुकड़ा AdventureWorks2012 नमूना डेटाबेस पूरी तरह से काम करता है और कैसे का एक अच्छा दृश्य स्पष्टीकरण देता COALESCE काम करता है:
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
ISNULL के लिए सिर्फ एक प्रतिस्थापन की तुलना में बहुत अधिक है। मैं इस बात से पूरी तरह सहमत हूं कि कोलेस की आधिकारिक "प्रलेखन" अस्पष्ट और अप्राप्य है। यह लेख बहुत मदद करता है। http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
यहाँ एक सरल क्वेरी समाहित है -
select * from person where coalesce(addressId, ContactId) is null.
यह उन व्यक्तियों को वापस लौटा देगा जहां पता और संपर्क दोनों ही अशक्त हैं।
coalesce फ़ंक्शन
जैसे
Coalesce () फ़ंक्शन की सबसे सरल परिभाषा हो सकती है:
Coalesce () फ़ंक्शन सभी पारित किए गए तर्कों का मूल्यांकन करता है और फिर उस तर्क के पहले उदाहरण का मान लौटाता है जो किसी NULL का मूल्यांकन नहीं करता था।
नोट: यह सभी मापदंडों का मूल्यांकन करता है, अर्थात लौटे / नहीं पूर्ण पैरामीटर के दाईं ओर तर्क (नों) का मूल्यांकन नहीं छोड़ता है।
वाक्य - विन्यास:
Coalesce(arg1, arg2, argN...)
खबरदार : NULL का मूल्यांकन करने वाले तर्कों के अलावा, अन्य सभी (NOT-NULL) तर्कों को या तो एक ही डेटाटाइप का होना चाहिए या मिलान-प्रकारों का होना चाहिए (जो कि एक संगत डेटाटाइप में "निहित रूप से स्वतः परिवर्तित" हो सकता है, उदाहरण देखें) नीचे:
PRINT COALESCE(NULL, ('str-'+'1'), 'x') --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
--PRINT COALESCE(NULL, 'text', '3', 3) --ERROR: passed args are NOT matching type / can't be implicitly converted.
PRINT COALESCE(NULL, 3, 7.0/2, 1.99) --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
DECLARE @dt DATE = getdate()
PRINT COALESCE(NULL, @dt, '1995-01-31') --returns today's date, works fine as implicit conversion into DATE type occurs.
--DATE comes before VARCHAR (works):
PRINT COALESCE(NULL, @dt, 'str') --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
HTH
ISNULL
, इसके मानक नहीं, कम लचीले, मैंने पढ़ा कि यह पहले तर्क के डेटाटाइप को हमेशा लौटाएगा, जैसे लौटे मूल्य का डेटाटाइप नहींCOALESCE
करता है।