SQL सर्वर क्वेरी में 0 के साथ NULL को प्रतिस्थापित करना


175

मैंने एक क्वेरी विकसित की है, और मुझे मिलने वाले पहले तीन कॉलम के परिणामों में NULL। मैं इसे कैसे बदल सकता हूं 0?

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

@ user2246674 पहले तीन कॉलम: योग (मामला जब c.runstatus = 'सफल' तब 1 अंत) के रूप में सफल, योग (मामला जब c.runstatus = 'विफल' हुआ तो 1 अंत विफल के रूप में, योग (मामला जब c.runstatus = 'रद्द' तब 1 अंत) रद्द के रूप में
भास्कर मिश्रा

स्पार्की, ओरेकल अलग नहीं है NVL या NVL2 का उपयोग करने के लिए isnull ... check oracle-base.com/articles/misc/null-related-functions
KingRider

जवाबों:


376

जब आप nullकिसी अन्य चीज़ के साथ संभवतः कॉलम को बदलना चाहते हैं , तो IsNull का उपयोग करें ।

SELECT ISNULL(myColumn, 0 ) FROM myTable

यदि यह पहले स्थान पर अशक्त है, तो यह myColumn में 0 डाल देगा।


2
SQL Server 2000 या 2005 ISNULL का उपयोग करने वाले कुछ लोगों के लिए SQL Server 2008 और इसके बाद का संस्करण है।
काइल

1
कई कॉलम के लिए मुझे कई बार ISNULL लिखना पड़ता है या क्या ISNULL (myColumns, 0) जैसा कुछ है?
Flaudre

@ काइल: यह गलत है: व्यक्तिगत अनुभव (और एक पुस्तक उद्धरण ) से, मैं पुष्टि कर सकता हूं कि ISNULL (कम से कम) SQL सर्वर 2000 के बाद से समर्थित है, शायद पहले भी।
हेंजी

@Flaudre: आपको कई बार ISNULL लिखना होगा, क्योंकि हर आउटपुट कॉलम की अपनी अभिव्यक्ति होनी चाहिए।
हेंजी

यह एसक्यूएल सर्वर 2016 में सटीक परिणाम प्राप्त करने के लिए मेरी मदद करता है। बहुत बहुत धन्यवाद, आपने सिर्फ मेरा दिन @phadaphunk
PatsonLeaner

83

आप इन दोनों विधियों का उपयोग कर सकते हैं लेकिन इनमें अंतर हैं:

SELECT ISNULL(col1, 0 ) FROM table1
SELECT COALESCE(col1, 0 ) FROM table1

तुलना तुलना () और ISNULL ():

  1. ISNULL फ़ंक्शन और COALESCE अभिव्यक्ति का एक समान उद्देश्य है, लेकिन अलग तरह से व्यवहार कर सकते हैं।

  2. क्योंकि ISNULL एक फ़ंक्शन है, इसका मूल्यांकन केवल एक बार किया जाता है। जैसा कि ऊपर वर्णित है, COALESCE अभिव्यक्ति के लिए इनपुट मानों का मूल्यांकन कई बार किया जा सकता है।

  3. परिणामी अभिव्यक्ति का डेटा प्रकार निर्धारण अलग है। ISNULL पहले पैरामीटर के डेटा प्रकार का उपयोग करता है, COALESCE CASE अभिव्यक्ति नियमों का पालन करता है और उच्चतम वरीयता के साथ डेटा प्रकार का मान लौटाता है।

  4. परिणाम अभिव्यक्ति की पूर्णता ISNULL और COALESCE के लिए अलग है। ISNULL रिटर्न वैल्यू को हमेशा NULLable नहीं माना जाता है (रिटर्न वैल्यू को गैर-अशक्त माना जाता है) जबकि गैर-शून्य मापदंडों के साथ COALES को NULL माना जाता है। तो भाव ISNULL (NULL, 1) और COALESCE (NULL, 1) हैं, हालांकि समतुल्य अलग-अलग अशक्तता मान हैं। इससे फर्क पड़ता है कि यदि आप इन अभिव्यक्तियों का उपयोग गणना किए गए कॉलम में कर रहे हैं, तो महत्वपूर्ण अवरोध पैदा कर रहे हैं या स्केलर यूडीएफ निर्धारक का रिटर्न मूल्य बना रहे हैं ताकि इसे निम्न उदाहरण में दिखाए अनुसार अनुक्रमित किया जा सके।

- यह कथन विफल रहता है क्योंकि प्राथमिक कुंजी NULL मानों को स्वीकार नहीं कर सकता है - और Col2 के लिए COALESCE अभिव्यक्ति की अशक्तता - NULL का मूल्यांकन करता है।

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0) PRIMARY KEY, 
    col3 AS ISNULL(col1, 0) 
); 

- यह कथन सफल होता है क्योंकि - ISNULL फ़ंक्शन की अशक्तता NULL NULL का मूल्यांकन नहीं करती है।

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. ISNULL और COALESCE के लिए मान्यताएं भी अलग-अलग हैं। उदाहरण के लिए, ISNULL के लिए एक NULL मान int में परिवर्तित हो जाता है जबकि COALESCE के लिए, आपको एक डेटा प्रकार प्रदान करना होगा।

  2. ISNULL केवल 2 पैरामीटर लेता है जबकि COALESCE मापदंडों की एक परिवर्तनीय संख्या लेता है।

    यदि आपको और अधिक जानने की आवश्यकता है, तो यहाँ msdn का पूरा दस्तावेज़ है।


23

के साथ coalesce:

coalesce(column_name,0)

हालांकि, जहां संक्षेप when condition then 1, तुम बस के रूप में आसानी बदल सकता है sumके लिए count- उदाहरण के लिए:

count(case when c.runstatus = 'Succeeded' then 1 end) as Succeeded,

( Count(null)रिटर्न 0, जबकि sum(null)अशक्त रिटर्न।)


10

जब आप पहले तीन कॉलम कहते हैं, तो क्या आपका मतलब है आपके SUMकॉलम? यदि हां, तो ELSE 0अपने CASEबयानों में जोड़ें । SUMएक का NULLमूल्य है NULL

sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 


7

इस कोड में अपना कॉलम लपेटें।

 ISNULL(Yourcolumn, 0)

शायद जाँच करें कि आप क्यों अशक्त हो रहे हैं


6

का उपयोग करें COALESCE, जो पहले नहीं-शून्य मान उदा

SELECT COALESCE(sum(case when c.runstatus = 'Succeeded' then 1 end), 0) as Succeeded

यदि इसे वापस लौटाया जाता है तो इसे 0 के रूप में सेट किया जाएगा NULL


1

अपने केस स्टेटमेंट में एक और जोड़ें ताकि टेस्ट की स्थिति न मिलने पर वे डिफ़ॉल्ट रूप से शून्य हो जाएं। यदि परीक्षण की स्थिति नहीं मिली है तो फिलहाल SUM () फ़ंक्शन को पास किया जा रहा है।

  Select c.rundate, 
    sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
    sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
    sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 
    count(*) as Totalrun from
    (    Select a.name,case when b.run_status=0 Then 'Failed' when b.run_status=1 Then 'Succeeded'
    when b.run_status=2 Then 'Retry' Else 'Cancelled' End as Runstatus,
    ---cast(run_date as datetime)
                cast(substring(convert(varchar(8),run_date),1,4)+'/'+substring(convert(varchar(8),run_date),5,2)+'/'          +substring(convert(varchar(8),run_date),7,2) as Datetime) as RunDate
    from msdb.dbo.sysjobs as a(nolock) inner join msdb.dbo.sysjobhistory as b(nolock) 
    on a.job_id=b.job_id
    where a.name='AI'
    and b.step_id=0) as c
    group by 
    c.rundate

1

यदि आप प्रेस्टो, एडब्ल्यूएस एथेना आदि का उपयोग कर रहे हैं, तो कोई ISNULL () फ़ंक्शन नहीं है। इसके बजाय, उपयोग करें:

SELECT COALESCE(myColumn, 0 ) FROM myTable

0
sum(case when c.runstatus = 'Succeeded' then 1 else 0 end) as Succeeded, 
sum(case when c.runstatus = 'Failed' then 1 else 0 end) as Failed, 
sum(case when c.runstatus = 'Cancelled' then 1 else 0 end) as Cancelled, 

यहाँ मुद्दा यह है कि और विवरण के बिना, आप एक नल प्राप्त करने के लिए बाध्य होते हैं जब रन स्टेटस कॉलम विवरण में वर्णित स्थिति नहीं होती है। Null में कुछ भी जोड़ने से Null परिणाम होगा, और यह इस क्वेरी के साथ समस्या है।

शुभ लाभ!


0

पिछले उत्तरों के बाद मैं SQL सर्वर db में अपना कॉलम नाम खो रहा था लेकिन इस सिंटैक्स का अनुसरण करने से मुझे ColumnName को बनाए रखने में मदद मिली

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