Sostituzione di NULL con 0 in una query del server SQL


176

Ho sviluppato una query e nei risultati per le prime tre colonne ottengo NULL. Come posso sostituirlo con 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 Le prime tre colonne: sum (case when c.runstatus = 'Succeeded' then 1 end) as Successed, sum (case when c.runstatus = 'Failed' then 1 end) as Failed, sum (case when c.runstatus = 'Annullato' quindi 1 fine) come Annullato
Bhaskar Mishra

Scintillante, Oracle è diverso non è impossibile usare NVL o NVL2 ... controlla oracle-base.com/articles/misc/null-related-functions
KingRider

Risposte:


377

Quando si desidera sostituire una possibile nullcolonna con qualcos'altro, utilizzare IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Questo metterà uno 0 in myColumn se è nullo in primo luogo.


2
Per quei pochi che usano SQL Server 2000 o 2005 ISNULL è SQL Server 2008 e versioni successive.
Kyle,

1
per più colonne devo scrivere ISNULL più volte o c'è qualcosa come ISNULL (myColumns, 0)?
Flaudre,

@Kyle: non è corretto: dall'esperienza personale (e da una citazione di un libro ), posso confermare che ISNULL è supportato da (almeno) SQL Server 2000, probabilmente anche prima.
Heinzi,

@Flaudre: devi scrivere ISNULL più volte, poiché ogni colonna di output deve avere una propria espressione.
Heinzi,

Questo mi aiuta anche a ottenere il risultato accurato in SQL Server 2016. Grazie mille, mi hai appena reso felice @phadaphunk
PatsonLeaner

83

Puoi usare entrambi questi metodi ma ci sono differenze:

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

Confronto di COALESCE () e ISNULL ():

  1. La funzione ISNULL e l'espressione COALESCE hanno uno scopo simile ma possono comportarsi diversamente.

  2. Poiché ISNULL è una funzione, viene valutata una sola volta. Come descritto sopra, i valori di input per l'espressione COALESCE possono essere valutati più volte.

  3. La determinazione del tipo di dati dell'espressione risultante è diversa. ISNULL utilizza il tipo di dati del primo parametro, COALESCE segue le regole di espressione CASE e restituisce il tipo di dati di valore con la precedenza più alta.

  4. La nullità dell'espressione del risultato è diversa per ISNULL e COALESCE. Il valore restituito ISNULL è sempre considerato NON NULLABILE (supponendo che il valore restituito sia un valore non annullabile) mentre COALESCE con parametri non nulli è considerato NULL. Quindi le espressioni ISNULL (NULL, 1) e COALESCE (NULL, 1) sebbene equivalenti abbiano valori di nullability diversi. Ciò fa la differenza se si utilizzano queste espressioni in colonne calcolate, creando vincoli chiave o rendendo deterministico il valore di ritorno di un UDF scalare in modo che possa essere indicizzato come mostrato nell'esempio seguente.

- Questa istruzione ha esito negativo poiché PRIMARY KEY non può accettare valori NULL e la nullità dell'espressione COALESCE per col2 viene valutata su NULL.

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

- Questa istruzione ha esito positivo poiché la nullità della funzione - ISNULL viene valutata come NOT NOT NULL.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Anche le convalide per ISNULL e COALESCE sono diverse. Ad esempio, un valore NULL per ISNULL viene convertito in int mentre per COALESCE, è necessario fornire un tipo di dati.

  2. ISNULL accetta solo 2 parametri mentre COALESCE accetta un numero variabile di parametri.

    se hai bisogno di saperne di più ecco il documento completo di msdn.


23

Con coalesce:

coalesce(column_name,0)

Sebbene, laddove si sommi when condition then 1, è possibile cambiare altrettanto facilmente, sumad countesempio:

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

( Count(null)restituisce 0, mentre sum(null)restituisce null.)


10

Quando dici le prime tre colonne, intendi le tue SUMcolonne? In tal caso, aggiungi ELSE 0alle tue CASEdichiarazioni. Il SUMdi un NULLvalore è 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

Un modo semplice è

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

7

Inserisci la tua colonna in questo codice.

 ISNULL(Yourcolumn, 0)

Forse controlla perché stai ottenendo null


6

Usa COALESCE, che restituisce il primo valore non nullo, ad es

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

Imposterà Riuscito come 0 se viene restituito come NULL.


1

Aggiungi un altro alle dichiarazioni del tuo caso in modo che siano predefinite a zero se la condizione di test non viene trovata. Al momento, se la condizione di test non viene rilevata, NULL viene passato alla funzione 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

Se si utilizza Presto, AWS Athena ecc., Non esiste alcuna funzione ISNULL (). Invece, usa:

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, 

il problema qui è che senza l'istruzione else, si è tenuti a ricevere un valore Null quando lo stato della corsa non è lo stato dichiarato nella descrizione della colonna. L'aggiunta di qualcosa a Null comporterà Null e questo è il problema con questa query.

In bocca al lupo!


0

seguendo le risposte precedenti stavo perdendo il mio nome di colonna nel db del server SQL, ma seguire questa sintassi mi ha aiutato a conservare anche il ColumnName

ISNULL(MyColumnName, 0) MyColumnName
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.