2011-09-13 14 views
62

मुझे पता है कि एकाधिक पैरामीटर COALESCE पर पास किए जा सकते हैं, लेकिन जब आप देखना चाहते हैं तो यह देखने के लिए केवल एक अभिव्यक्ति जांचें कि क्या यह अस्तित्व में नहीं है, क्या आप डिफ़ॉल्ट का उपयोग करते हैं या यह ISNULL का उपयोग करने के लिए बेहतर अभ्यास है?एक विशिष्ट स्थिति की जांच के लिए COALESCE का उपयोग कर ISNULL बनाम उपयोग कर रहा है?

क्या दोनों के बीच कोई प्रदर्शन लाभ है?

+5

[COALESCE प्रलेखन] (http://msdn.microsoft।com/en-us/library/ms190349.aspx) में यह नोट है: ISNULL और COALESCE हालांकि समकक्ष, अलग-अलग व्यवहार कर सकते हैं। गैर-शून्य पैरामीटर वाले ISNULL से जुड़ी एक अभिव्यक्ति को पूर्ण नहीं माना जाता है, जबकि गैर-शून्य पैरामीटर वाले COALESCE से जुड़े अभिव्यक्ति को शून्य माना जाता है ... –

+3

'ISNULL' परिणाम को पहली अभिव्यक्ति के डेटाटाइप पर भी सहारा देगा [ जैसा कि यहां दिखाया गया है] (http://haacked.com/archive/2005/01/21/difference-between-isnull-and-coalesce.aspx) –

+4

यह आलेख अंतर को बहुत अच्छी तरह से बताता है ... http: // sqlmag .com/t-sql/coalesce-vs-isnull –

उत्तर

47

This problem reported on Microsoft ConnectCOALESCE और ISNULL के बीच कुछ अंतर का पता चलता है:

हमारे प्रसंस्करण का एक प्रारंभिक हिस्सा COALESCE(expression1, expression2)CASE WHEN expression1 IS NOT NULL THEN expression1 ELSE expression2 END के रूप में पुनर्लेखन। [इस उदाहरण] में:

COALESCE ((SELECT Nullable 
      FROM Demo 
      WHERE SomeCol = 1), 1) 

हम उत्पन्न:

SELECT CASE 
      WHEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) IS NOT NULL 
      THEN (SELECT Nullable FROM Demo WHERE SomeCol = 1) 
      ELSE 1 
     END 

क्वेरी प्रोसेसिंग के बाद के चरणों समझ में नहीं आता है कि दो सबक्वेरी मूल रूप से एक ही अभिव्यक्ति थे, इसलिए वे सबक्वेरी दो बार निष्पादित ..

एक कामकाज, हालांकि मुझे इसका सुझाव देने से नफरत है, COALESCE को ISNULL में बदलना है, क्योंकि बाद में सबक्वायरी डुप्लिकेट नहीं करता है।

+2

त्वरित प्रश्न, यदि आपके पास 3 मान हैं, जैसे coalesce (अभिव्यक्ति 1, अभिव्यक्ति 2, अभिव्यक्ति 3, 1), जहां वे 'अभिव्यक्ति' वास्तव में कथन का चयन करते हैं, तो क्या यह वास्तविक रूप से घोंसला वाले बयान के लिए समझ में आता है? यानी isnull (अभिव्यक्ति 1, isnull (अभिव्यक्ति 2, isnull (अभिव्यक्ति 3, 1)) – ganders

22

मुझे नहीं लगता, लेकिन COALESCE SQL '92 मानक में है और अधिक अलग डेटाबेस द्वारा समर्थित है। यदि आप पोर्टेबिलिटी के लिए जाते हैं, तो ISNULL का उपयोग न करें।

+2

यह ifnull का शून्य है? –

+9

मेरा बिंदु बिल्कुल। ;- डी और यह ओरेकल में एनवीएल है। – GolezTrol

1

जहां केवल एक शून्य स्थिति है, ISNULL कम ओवरहेड होगा। हालांकि अंतर शायद नगण्य है।

+1

क्या आपके पास इस दावे के लिए कोई समर्थन है कि 'ISNULL' के साथ कम ओवरहेड है? –

+0

@ जोशुआ ड्रेक: दो क्षेत्र हैं जहां 'कोलेसेस' एक दूसरे के ऊपर का उपयोग करते समय अधिक ओवरहेड पेश करेगा। सबसे पहले, 'ISNULL' एक निश्चित संख्या में इनपुट से संबंधित है, जहां 'COALESCE' को किसी भी इनपुट के साथ काम करने के लिए नामित किया गया है। दूसरा, 'COALESCE' को उच्चतम डेटा प्रकार की प्राथमिकता के साथ अभिव्यक्ति के डेटा प्रकार को वापस करने के लिए कॉन्फ़िगर किया गया है, जबकि' ISNULL' 'check_expression' के समान प्रकार देता है। जैसा कि मैंने उपरोक्त कहा है, SQL सर्वर के बाद के संस्करणों में अंतर शायद नगण्य है, लेकिन सख्ती से बोलना अभी भी ऊपर की ओर है। –

9

COALESCE में आप कई भाव, जहां ISNULL में के रूप में आप केवल एक अभिव्यक्ति

COALESCE (expression [ ,...n ]) 

ISNULL (check_expression , replacement_value) 
-2

जांच कर सकते हैं COALESCE में एक से अधिक एक्सप्रेशन का उपयोग कर सकते हैं, यह मूल्य जो एक अशक्त नहीं है और होता है वापस आ जाएगी हो सकता है पहले ... उदाहरण

DECLARE @Value1 INT, @Value2 INT, @Value3 INT, @Value4 INT 
SELECT @Value2 = 2, @Value4 = 4 
SELECT COALESCE(@Value1, @Value2, @Value3, @Value4) 
SELECT COALESCE(@Value1, @Value4, @Value3, @Value2) 

और IsNull में के लिए अभिव्यक्ति अशक्त यह दूसरा पैरामीटर वापस आ जाएगी प्रदान की है, और निश्चित रूप से आप केवल एक के लिए जाँच कर सकते हैं अभिव्यक्ति ...

तो अगर चाहते हैं एकाधिक अभिव्यक्ति की जाँच करें और पहले का चयन उन के बीच में रिक्त नहीं है, तो सम्मिलित अन्यथा IsNull

+2

ओपी ने कहा कि वे कई मानकों को संभालने के लिए COALESCE की क्षमता से अवगत थे, सवाल केवल विशिष्ट मामले के बारे में विशिष्ट मामले के बारे में है। –

+0

@JoshuaDrake कृपया पूरा उत्तर पढ़ें ... मैंने प्रश्न पढ़ा है और मैं आपको पूरी तरह से अपना जवाब पढ़ने का अनुरोध करता हूं ... कुछ बिंदु और नीचे इसे देखने के लिए बहुत आसान है –

4

उल्लेख के लायक के लिए जाने का उपयोग करें कि दोनों के बीच प्रकार से निपटने के भी (देखें एक फर्क कर सकते हैं this related answer item (2))।

एक प्रश्न अशक्त तुलना लिखने के लिए एक शॉर्टकट का उपयोग करने की कोशिश करता है कहते हैं:

select * from SomeTable 
where IsNull(SomeNullableBitField, -1) != IsNull(SomeOtherNullableBitField, -1); 

जो क्योंकि पहले मामले में

select * from SomeTable 
where coalesce(SomeNullableBitField, -1) != coalesce(SomeOtherNullableBitField, -1); 

तुलना में अलग है, IsNull() प्रकार बलों होने के लिए थोड़ा (इसलिए -1 सच में परिवर्तित हो जाता है) जबकि दूसरा मामला एक int को दोनों को बढ़ावा देगा।

with input as 
(
    select convert(bit, 1) as BitOn,  
     convert(bit, 0) as BitOff, 
     convert(bit, null) as BitNull 
) 
select BitOn, 
     BitOff, 
     BitNull, 
     IsNull(BitOn, -1) IsNullBitOn,   -- true 
     IsNull(BitOff, -1) IsNullBitOff,  -- false 
     IsNull(BitNull, -1) IsNullBitNull,  -- true, converts the -1 to bit 
     coalesce(BitOn, -1) CoalesceBitOn,  -- 1 
     coalesce(BitOff, -1) CoalesceBitOff, -- 0  
     coalesce(BitNull, -1) CoalesceBitNull -- -1 
    from input; 

प्रश्न पर ही एक ही टिप्पणी/लिंक (@ मार्टिन स्मिथ) है।

4

एक बड़ी बात जो मुझे स्पष्ट रूप से इंगित नहीं करती है वह यह है कि ISNULL का आउटपुट प्रकार पहली अभिव्यक्ति के समान है लेकिन COALESCE के साथ यह उच्चतम प्राथमिकता के मूल्य का डेटाटाइप देता है।

DECLARE @X VARCHAR(3) = NULL 
DECLARE @Y VARCHAR(10) = '123456789' 
/* The datatype returned is similar to X, or the first expression*/ 
SELECT ISNULL(@X, @Y) ---> Output is '123' 
/* The datatype returned is similar to Y, or to the value of highest precedence*/ 
SELECT COALESCE(@X, @Y) ---> Output is '123456789' 
+3

यह पहली बनाम दूसरी/एनवी अभिव्यक्ति का मामला नहीं है। [यहां] देखें (http://stackoverflow.com/questions/18828641/sql-difference-between-coalesce-and-isnull/18828687#18828687): 'ISNULL पहले पैरामीटर के डेटा प्रकार का उपयोग करता है, COALESCE CASE अभिव्यक्ति का पालन करता है उच्चतम प्राथमिकता वाले डेटा प्रकार के मान को नियम देता है और देता है –

2

इस विवरण सम्मिलित isnull

एसक्यूएल में COALESCE फ़ंक्शन अपने तर्कों के बीच पहली गैर शून्य अभिव्यक्ति बनाम के बारे में स्पष्ट कर देता है।

COALESCE ("expression 1", "expressions 2", ...) 

यह निम्न मामला बयान के रूप में एक ही है::

SELECT CASE ("column_name") 
    WHEN "expression 1 is not NULL" THEN "expression 1" 
    WHEN "expression 2 is not NULL" THEN "expression 2" 
    ... 
    [ELSE "NULL"] 
    END 
FROM "table_name"; 

एसक्यूएल सर्वर में, IsNull() फ़ंक्शन एक और मूल्य के साथ शून्य मूल्य को बदलने के लिए प्रयोग किया जाता है COALESCE के लिए वाक्य रचना इस प्रकार है ।

select CountryName = ISNULL("columnname", 'INDIA') from Countries 

संगठित होना पहली गैर अशक्त अभिव्यक्ति जहां isnull के रूप में() हमारे वांछित मूल्य के साथ शून्य मान को बदलने के लिए प्रयोग किया जाता है लौटने।

COALESCE एएनएसआई मानकों का एक हिस्सा है और लगभग सभी डेटाबेस में उपलब्ध है।

  1. COALESCE उत्पादन डेटा प्रकार पूर्वता के आधार पर के प्रकार निर्धारित करता है जहां IsNull के साथ के रूप में, डेटा प्रकार डेटा से प्रभावित नहीं है:

    जब IsNull वी COALESCE के बीच वहाँ मापदंडों निर्णय लेने से ध्यान रखा जाना है प्राथमिकता टाइप करें।

  2. निम्नलिखित पर विचार करें एसक्यूएल बयान

    DECLARE @c5 VARCHAR(5); 
    SELECT 'COALESCE', COALESCE(@c5, 'longer name') 
    UNION ALL 
    SELECT 'ISNULL', ISNULL(@c5, 'longer name'); 
    

परिणाम:

COALESCE longer name 
ISNULL longe 

यह इसलिए होता है क्योंकि IsNull पहला तर्क के डेटा प्रकार लेता है, COALESCE सभी तत्वों का निरीक्षण करता है और चुनता है, जबकि सबसे अच्छा फिट (इस मामले में, VARCHAR (11))

डीसीडिन पर अधिक विस्तृत स्पष्टीकरण के लिए COALESCE के बीच जी IsNull बनाम इस जाँच: https://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

0

NULL और COALESCE हमेशा परस्पर विनिमय नहीं कर रहे हैं।

enter image description here

तालिका के ऊपर स्थित Exam Ref 70-761 Querying Data with Transact-SQL पुस्तक Itzik बेन-गण द्वारा लिखित से ISNULL और COALESCE के बीच तुलना है: यह आदेश पता करने के लिए जब उसके बेहतर एक दूसरे के ऊपर का उपयोग करने के अपने मतभेदों को पता करने के लिए योग्य है।


  1. समर्थित मानकों की संख्या - ISNULL बनाम >2 के लिए 2 जब COALESCE
  2. ISNULL का उपयोग कर मालिकाना T-SQL सुविधा है और COALESCE आईएसओ/ANSI SQL मानक
  3. परिणाम के डेटा प्रकार है महत्वपूर्ण है। उपरोक्त तालिका में नोट पढ़ने के बाद, जांच निम्नलिखित मामलों: के रूप में यह शाब्दिक नहीं NULL है

    DECLARE @x VARCHAR(3) = NULL 
         ,@y VARCHAR(10) = '1234567890'; 
    
    SELECT ISNULL(@x, @y) AS [ISNULL], COALESCE(@x, @y) AS [COALESCE]; 
    

    enter image description here

    ISNULL पहला तर्क के डेटा प्रकार हो रही है। यह VARCHAR(3) है और परिणामस्वरूप, दूसरा तर्क डेटा मिलान करने के लिए कट गया है। COALESCE डेटा प्रकार के साथ यदि उच्चतम प्राथमिकता उपयोग की जाती है।

    DECLARE @x VARCHAR(8) = '123x5' 
         ,@y INT = 123; 
    
    SELECT ISNULL(@x, @y) AS [ISNULL]; 
    SELECT COALESCE(@x, @y) AS [COALESCE]; 
    

    enter image description here

    enter image description here

    ISNULL,, पहला तर्क के डेटा प्रकार लौट जाता है, जबकि में COALESCE हम त्रुटि हो रही है के रूप में INT सर्वोच्च प्राथमिकता है और पहले की रूपांतरण है INT पर तर्क मान विफल रहता है।

  4. परिणाम की nullability महत्वपूर्ण भी हो सकता है। , उदाहरण के लिए:

    enter image description here

    enter image description here

    COALESCE इस्तेमाल करते हुए हम स्तंभ Yes करने के लिए सेट की एक NOT NULL संपत्ति, केवल जब है:

    DECLARE @x VARCHAR(3) = NULL 
         ,@y VARCHAR(3) = NULL; 
    
    DROP TABLE IF EXISTS [dbo].[DataSource01]; 
    
    SELECT ISNULL(10, 20) AS [C1] 
         ,ISNULL(@x, 'text') AS [C2] 
         ,ISNULL(@x, @y) AS [C3] 
    INTO [dbo].[DataSource01]; 
    
    DROP TABLE IF EXISTS [dbo].[DataSource02]; 
    
    SELECT COALESCE(10, 20) AS [C1] 
         ,COALESCE(@x, 'text') AS [C2] 
         ,COALESCE(@x, @y) AS [C3] 
    INTO [dbo].[DataSource02]; 
    

    के प्रत्येक स्तंभ के Nullable संपत्ति जाँच करें सभी इनपुट गैर शून्य सक्षम हैं।

    CASE WHEN (<subquery>) IS NOT NULL THEN (<subquery>) ELSE 0 END 
    

    हैं जब खंड में सबक्वेरी के निष्पादन का परिणाम शून्य नहीं है, एसक्यूएल सर्वर यह कार्यान्वित:

  5. एसक्यूएल मानक के अनुसार, COALESCE अभिव्यक्ति करने के लिए अनुवाद किया है उस खंड में दूसरी बार। दूसरे शब्दों में, इस तरह के मामले में यह दो बार निष्पादित करता है। सिर्फ अगर जब खंड में निष्पादन की परिणाम शून्य है, एसक्यूएल सर्वर न कि अभिव्यक्ति देता है सबक्वेरी फिर से निष्पादित नहीं करता है,। तो उपक्विरी का उपयोग करते समय, ISNULL फ़ंक्शन का प्रदर्शन लाभ होता है।

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