TSQL में COALESCE फ़ंक्शन


109

क्या कोई समझा सकता है कि TSQL में COALESCE फ़ंक्शन कैसे काम करता है? वाक्य विन्यास इस प्रकार है

COALESCE (x, y)

इस फ़ंक्शन पर MSDN दस्तावेज़ बहुत अस्पष्ट है

जवाबों:


74

मुझे बताया गया है कि COALESCE ISNULL की तुलना में कम खर्चीला है, लेकिन शोध से यह संकेत नहीं मिलता है। ISNULL केवल दो मापदंडों को लेता है, NULL के लिए मूल्यांकन किए जाने वाले क्षेत्र और यदि आप चाहते हैं कि इसका मूल्यांकन NULL के रूप में किया जाए। COALESCE किसी भी संख्या में पैरामीटर लेगा, और पहला मान लौटाएगा जो NULL नहीं है।

यहाँ विवरणों का अधिक गहन वर्णन है http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/


6
उपयोग करने से सावधान रहें ISNULL, इसके मानक नहीं, कम लचीले, मैंने पढ़ा कि यह पहले तर्क के डेटाटाइप को हमेशा लौटाएगा, जैसे लौटे मूल्य का डेटाटाइप नहीं COALESCEकरता है।
sprocket12

215

मुझे यकीन नहीं है कि आपको क्यों लगता है कि दस्तावेज़ अस्पष्ट है।

यह बस एक-एक करके सभी मापदंडों से गुजरता है, और पहले वाला रिटर्न देता है 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()में नहीं है।


4
+1 डेटा प्रकार की पूर्ववर्ती स्थिति के बारे में आपके स्पष्टीकरण के लिए। मेरा मानना ​​है कि ISNULLपहले पैरामीटर के रूप में उसी डेटाटाइप के साथ एक मान लौटाता है, हालांकि
लामक

5
आपका अंतिम कोड उदाहरण त्रुटि को देना चाहिए 'कम से कम एक तर्क के लिए एक टाइप NULL होना चाहिए' स्रोत: sql-server-performance.com/2007/…
maqk

2
लगभग शून्य मान प्रदान करने का प्रबंधन करते हुए प्रलेखन बहुत कुछ कहता है। अच्छे डॉक्स एक साधारण परिणाम के साथ एक सरल उदाहरण प्रदान करते हैं। कॉल्ससे तुरंत आगे बढ़ता है expressions, CASE के साथ तुलना करता है, ISNULL के साथ तुलना करता है, और अंत में कोई परिणाम नहीं के साथ एक उदाहरण है। फिर बहुत अधिक विवरण के साथ एक अत्यधिक जटिल उदाहरण। जब हम सभी की आवश्यकता होती है तो यह जवाब डब्ल्यूटीएफ की 5 - 6 लाइनों के साथ होता है।
पी। ब्रायन। मैके


18

यहाँ मैं जिस तरह से 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

4

ISNULL के लिए सिर्फ एक प्रतिस्थापन की तुलना में बहुत अधिक है। मैं इस बात से पूरी तरह सहमत हूं कि कोलेस की आधिकारिक "प्रलेखन" अस्पष्ट और अप्राप्य है। यह लेख बहुत मदद करता है। http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/


3
वह लेख जो आप से जुड़ा है वह अत्यंत भ्रामक है (जैसा कि टिप्पणी अनुभाग में लेखक सहित कई लोगों द्वारा इंगित किया गया है)। सभी साफ-सुथरी तरकीबें जो वह हाइलाइट करता है, सभी को मोटे के स्थान पर ISNULL का उपयोग करके किया जा सकता है।
होबो स्पाइडर

3

यहाँ एक सरल क्वेरी समाहित है -

select * from person where coalesce(addressId, ContactId) is null.

यह उन व्यक्तियों को वापस लौटा देगा जहां पता और संपर्क दोनों ही अशक्त हैं।

coalesce फ़ंक्शन

  • कम से कम दो तर्क देता है।
  • तर्क पूर्णांक प्रकार के होने चाहिए।
  • पहला गैर-अशक्त तर्क लौटाएं।

जैसे

  • coalesce (नल, 1, 2, 3) 1 वापस आ जाएगी।
  • coalesce (null, null) वापस आएगा।

1

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


0
declare @store table (store_id varchar(300))
insert into @store 
values ('aa'),('bb'),('cc')
declare @str varchar (4000)
select @str = concat(@str+',',store_id) from @store
select @str

1
मैंने पाया कि यह बहुत सरल है।
जिओ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.