Mengganti NULL dengan 0 dalam kueri SQL server

176

Saya telah mengembangkan kueri, dan dalam hasil untuk tiga kolom pertama saya dapatkan NULL. Bagaimana saya bisa menggantinya 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
Bhaskar Mishra
sumber
@ user2246674 Tiga kolom pertama: jumlah (jumlah ketika c.runstatus = 'Berhasil' maka 1 akhir) sebagai Berhasil, jumlah (kasus ketika c.runstatus = 'Gagal' lalu 1 akhir) sebagai Gagal, jumlah (kasus ketika c.runstatus = 'Dibatalkan' lalu 1 akhir) sebagai Dibatalkan
Bhaskar Mishra
Sparky, Oracle berbeda bukan isnull untuk menggunakan NVL atau NVL2 ... periksa oracle-base.com/articles/misc/null-related-functions
KingRider

Jawaban:

377

Saat Anda ingin mengganti nullkolom yang mungkin dengan yang lain, gunakan IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Ini akan menempatkan 0 di myColumn jika itu nol di tempat pertama.

phadaphunk
sumber
2
Untuk beberapa yang menggunakan SQL Server 2000 atau 2005 ISNULL adalah SQL Server 2008 dan di atasnya.
Kyle
1
untuk beberapa kolom apakah saya harus menulis ISNULL beberapa kali atau apakah ada sesuatu seperti ISNULL (myColumns, 0)?
Flaudre
@Kyle: Itu tidak benar: Dari pengalaman pribadi (dan kutipan buku ), saya dapat mengonfirmasi bahwa ISNULL didukung sejak (setidaknya) SQL Server 2000, mungkin bahkan lebih awal.
Heinzi
@Flaudre: Anda harus menulis ISNULL beberapa kali, karena setiap kolom output harus memiliki ekspresi sendiri.
Heinzi
Ini membantu saya juga untuk mendapatkan hasil yang akurat dalam SQL Server 2016. Terima kasih banyak, Anda baru saja membuat hari saya @phadaphunk
PatsonLeaner
83

Anda dapat menggunakan kedua metode ini tetapi ada perbedaan:

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

Membandingkan COALESCE () dan ISNULL ():

  1. Fungsi ISNULL dan ekspresi COALESCE memiliki tujuan yang sama tetapi dapat berperilaku berbeda.

  2. Karena ISNULL adalah fungsi, ia dievaluasi hanya sekali. Seperti dijelaskan di atas, nilai input untuk ekspresi COALESCE dapat dievaluasi beberapa kali.

  3. Penentuan tipe data dari ekspresi yang dihasilkan berbeda. ISNULL menggunakan tipe data dari parameter pertama, COALESCE mengikuti aturan ekspresi KASUS dan mengembalikan tipe data nilai dengan prioritas tertinggi.

  4. NULLability dari ekspresi hasil berbeda untuk ISNULL dan COALESCE. Nilai kembali ISNULL selalu dianggap TIDAK NULLable (dengan asumsi nilai kembali adalah non-nullable) sedangkan COALESCE dengan parameter non-nol dianggap NULL. Jadi ekspresi ISNULL (NULL, 1) dan COALESCE (NULL, 1) meskipun setara memiliki nilai nullability yang berbeda. Ini membuat perbedaan jika Anda menggunakan ekspresi ini dalam kolom yang dihitung, membuat batasan kunci atau membuat nilai pengembalian skalar UDF deterministik sehingga dapat diindeks seperti yang ditunjukkan pada contoh berikut.

- Pernyataan ini gagal karena PRIMARY KEY tidak dapat menerima nilai NULL - dan nullability dari ekspresi COALESCE untuk col2 - mengevaluasi ke NULL.

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

- Pernyataan ini berhasil karena nullability dari fungsi - ISNULL mengevaluasi AS NOT NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Validasi untuk ISNULL dan COALESCE juga berbeda. Sebagai contoh, nilai NULL untuk ISNULL dikonversi ke int sedangkan untuk COALESCE, Anda harus memberikan tipe data.

  2. ISNULL hanya membutuhkan 2 parameter sedangkan COALESCE mengambil sejumlah variabel parameter.

    jika Anda perlu tahu lebih banyak di sini adalah dokumen lengkap dari msdn.

Mojtaba Rezaeian
sumber
23

Dengan coalesce:

coalesce(column_name,0)

Meskipun, ketika dijumlahkan when condition then 1, Anda bisa dengan mudah berubah sumke count- misalnya:

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

( Count(null)mengembalikan 0, sementara sum(null)mengembalikan nol.)


sumber
10

Ketika Anda mengatakan tiga kolom pertama, apakah maksud Anda SUMkolom Anda ? Jika demikian, tambahkan ELSE 0ke CASEpernyataan Anda . Nilai SUMsebuah NULLadalah 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, 
sgeddes
sumber
8

Cara sederhana adalah

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
Umang Patwa
sumber
7

Bungkus kolom Anda dalam kode ini.

 ISNULL(Yourcolumn, 0)

Mungkin periksa mengapa Anda mendapatkan nol

Polisi
sumber
6

Gunakan COALESCE, yang mengembalikan nilai bukan nol pertama misalnya

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

Akan menetapkan Succeeded sebagai 0 jika dikembalikan sebagai NULL.

dken
sumber
1

Tambahkan yang lain ke pernyataan kasus Anda sehingga menjadi nol jika kondisi pengujian tidak ditemukan. Saat ini jika kondisi pengujian tidak ditemukan, NULL diteruskan ke fungsi 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
Serigala jahat
sumber
1

Jika Anda menggunakan Presto, AWS Athena dll, tidak ada fungsi ISNULL (). Sebaliknya, gunakan:

SELECT COALESCE(myColumn, 0 ) FROM myTable
Gaz_Edge
sumber
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, 

masalahnya di sini adalah bahwa tanpa pernyataan lain, Anda terikat untuk menerima Null ketika status run bukan status yang dinyatakan dalam deskripsi kolom. Menambahkan apa pun ke Null akan menghasilkan Null, dan itu adalah masalah dengan permintaan ini.

Semoga berhasil!

Krishna Chavali
sumber
0

dengan mengikuti jawaban sebelumnya saya kehilangan nama kolom saya di SQL server db namun mengikuti sintaks ini membantu saya untuk mempertahankan ColumnName juga

ISNULL(MyColumnName, 0) MyColumnName
Bunglon
sumber