SQL Server sorgusunda NULL değerini 0 ile değiştirme


175

Bir sorgu geliştirdim ve ilk üç sütun için sonuçları olsun NULL. Nasıl değiştirebilirim 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 İlk üç sütun: Başarılı (c.runstatus = 'Başarılı olduğunda' sonra 1 son) durumda = 'İptal edildi' sonra 1 son) İptal Edildi
Bhaskar Mishra

Sparky, Oracle, NVL veya NVL2'yi kullanmak için farklı değil ... oracle-base.com/articles/misc/null-related-functions
KingRider

Yanıtlar:


376

Muhtemel bir nullsütunu başka bir şeyle değiştirmek istediğinizde IsNull kullanın .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Bu, ilk etapta null olursa myColumn'a 0 koyacaktır.


2
SQL Server 2000 veya 2005 kullanan birkaç kişi için ISNULL, SQL Server 2008 ve üstüdür.
Kyle

1
birden çok sütun için birden çok kez ISNULL yazmak zorunda veya ISNULL (myColumns, 0) gibi bir şey var mı?
Flaudre

@Kyle: Bu yanlış: Kişisel deneyim (ve bir kitap alıntı ), ISNULL (belki de daha önce), en azından SQL Server 2000 beri desteklendiğini onaylayabilirsiniz.
Heinzi

@Flaudre: Her çıktı sütununun kendi ifadesi olması gerektiğinden ISNULL öğesini birkaç kez yazmanız gerekir.
Heinzi

Bu da SQL Server 2016'da doğru sonucu almam için bana yardımcı oldu. Çok teşekkürler, az önce günümü @phadaphunk
PatsonLeaner

83

Bu yöntemlerin her ikisini de kullanabilirsiniz, ancak farklılıklar vardır:

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

COALESCE () ve ISNULL () karşılaştırılması:

  1. ISNULL işlevi ve COALESCE ifadesi benzer bir amaca sahiptir, ancak farklı davranabilir.

  2. ISNULL bir işlev olduğundan, yalnızca bir kez değerlendirilir. Yukarıda tarif edildiği gibi, COALESCE ifadesi için giriş değerleri birden çok kez değerlendirilebilir.

  3. Ortaya çıkan ifadenin veri türü belirlemesi farklıdır. ISNULL, ilk parametrenin veri türünü kullanır; COALESCE, CASE ifade kurallarına uyar ve en yüksek önceliğe sahip veri türünü döndürür.

  4. Sonuç ifadesinin NULL edilebilirliği ISNULL ve COALESCE için farklıdır. ISNULL dönüş değeri her zaman NOT NULLable olarak kabul edilir (dönüş değerinin null olmayan bir değer olduğu varsayılarak), null olmayan parametrelerle COALESCE null olarak kabul edilir. Dolayısıyla, eşdeğer olmasına rağmen ISNULL (NULL, 1) ve COALESCE (NULL, 1) ifadeleri farklı nulllability değerlerine sahiptir. Bu ifadeleri hesaplanan sütunlarda kullanıyorsanız, anahtar kısıtlamaları oluştururken veya bir skaler UDF'nin dönüş değerini aşağıdaki örnekte gösterildiği gibi dizine eklenmesi için belirleyici yaparsanız, bu bir fark yaratır.

PRIMARY KEY, NULL değerleri kabul edemediğinden ve col2 için COALESCE ifadesinin geçersiz olması NULL olarak değerlendirildiğinden, bu ifade başarısız olur.

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

- Bu ifade başarılı olur, çünkü - ISNULL işlevinin nullability AS NOT NULL olarak değerlendirilir.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. ISNULL ve COALESCE doğrulamaları da farklıdır. Örneğin, ISNULL için bir NULL değeri int değerine dönüştürülürken, COALESCE için bir veri türü sağlamanız gerekir.

  2. ISNULL sadece 2 parametre alırken COALESCE değişken sayıda parametre alır.

    daha fazla bilgi için burada msdn tam belge .


23

İle coalesce:

coalesce(column_name,0)

Toplayarak nerede rağmen when condition then 1, sadece aynı kolaylıkla değişebilir sumiçin count- örneğin:

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

( Count(null)0 sum(null)döndürür, null döndürür.)


10

İlk üç sütunu söylediğinizde, SUMsütunlarınızı mı kastediyorsunuz ? Eğer öyleyse, eklemek ELSE 0için için CASEifadeleri. SUMA NULLdeğeri olan 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, 

8

Basit bir yol

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

7

Sütununuzu bu koda sarın.

 ISNULL(Yourcolumn, 0)

Belki de null aldığını kontrol et


6

Kullanım COALESCE, ilk boş olmayan değeri döndüren örn.

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

Olarak döndürülürse 0 olarak başarılı olur NULL.


1

Vaka ifadelerinize, test koşulu bulunmazsa varsayılan olarak sıfıra ayarlanmaları için başka bir öğe ekleyin. Test koşulu bulunmazsa SUM () işlevine NULL geçirilir.

  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

Presto, AWS Athena vb. Kullanıyorsanız ISNULL () işlevi yoktur. Bunun yerine şunu kullanın:

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, 

Buradaki sorun, else deyimi olmadan, çalışma durumu sütun açıklamasında belirtilen durum olmadığında Null almak zorunda olmanızdır. Null'a bir şey eklemek Null ile sonuçlanır ve bu sorguda sorun budur.

İyi şanslar!


0

önceki yanıtları izleyerek SQL sunucumda db sütun adımı kaybediyordum ancak bu sözdizimini takip etmek de ColumnName tutmak için yardımcı oldu

ISNULL(MyColumnName, 0) MyColumnName
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.