Ersetzen von NULL durch 0 in einer SQL Server-Abfrage


175

Ich habe eine Abfrage entwickelt und in den Ergebnissen für die ersten drei Spalten erhalte ich NULL. Wie kann ich es durch ersetzen0 ?

  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 Die ersten drei Spalten: Summe (Fall, wenn c.runstatus = 'Erfolgreich', dann 1 Ende) als Erfolgreich, Summe (Fall, wenn c.runstatus = 'Fehlgeschlagen', dann 1 Ende) als Fehlgeschlagen, Summe (Fall, wenn c.runstatus = 'Abgebrochen' dann 1 Ende) als Abgebrochen
Bhaskar Mishra

Sparky, Oracle ist anders, nicht NVL oder NVL2 zu verwenden ... überprüfen Sie oracle-base.com/articles/misc/null-related-functions
KingRider

Antworten:


376

Wenn Sie eine möglicherweise nullSpalte durch etwas anderes ersetzen möchten , verwenden Sie IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Dies setzt eine 0 in myColumn, wenn es überhaupt null ist.


2
Für die wenigen, die SQL Server 2000 oder 2005 verwenden, ist ISNULL SQL Server 2008 und höher.
Kyle

1
Muss ich für mehrere Spalten ISNULL mehrmals schreiben oder gibt es so etwas wie ISNULL (myColumns, 0)?
Flaudre

@Kyle: Das ist falsch: Aus persönlicher Erfahrung (und einem Buchzitat ) kann ich bestätigen, dass ISNULL seit (mindestens) SQL Server 2000 unterstützt wird, wahrscheinlich sogar früher.
Heinzi

@Flaudre: Sie müssen ISNULL mehrmals schreiben, da jede Ausgabespalte einen eigenen Ausdruck haben muss.
Heinzi

Dies hilft mir auch, das genaue Ergebnis in SQL Server 2016 zu erhalten. Vielen Dank, Sie haben gerade meinen Tag @phadaphunk
PatsonLeaner

83

Sie können beide Methoden verwenden, es gibt jedoch Unterschiede:

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

Vergleich von COALESCE () und ISNULL ():

  1. Die ISNULL-Funktion und der COALESCE-Ausdruck haben einen ähnlichen Zweck, können sich jedoch unterschiedlich verhalten.

  2. Da ISNULL eine Funktion ist, wird sie nur einmal ausgewertet. Wie oben beschrieben, können die Eingabewerte für den COALESCE-Ausdruck mehrmals ausgewertet werden.

  3. Die Datentypbestimmung des resultierenden Ausdrucks ist unterschiedlich. ISNULL verwendet den Datentyp des ersten Parameters. COALESCE folgt den CASE-Ausdrucksregeln und gibt den Datentyp des Werts mit der höchsten Priorität zurück.

  4. Die NULL-Fähigkeit des Ergebnisausdrucks unterscheidet sich für ISNULL und COALESCE. Der ISNULL-Rückgabewert wird immer als NICHT NULL-fähig betrachtet (vorausgesetzt, der Rückgabewert ist nicht nullbar), während COALESCE mit Nicht-Null-Parametern als NULL betrachtet wird. Die Ausdrücke ISNULL (NULL, 1) und COALESCE (NULL, 1) haben also unterschiedliche Nullwertwerte, obwohl sie äquivalent sind. Dies macht einen Unterschied, wenn Sie diese Ausdrücke in berechneten Spalten verwenden, Schlüsseleinschränkungen erstellen oder den Rückgabewert einer skalaren UDF deterministisch machen, damit sie wie im folgenden Beispiel gezeigt indiziert werden kann.

- Diese Anweisung schlägt fehl, weil der PRIMARY KEY keine NULL-Werte akzeptieren kann und die Nullbarkeit des COALESCE-Ausdrucks für col2 als NULL ausgewertet wird.

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

- Diese Anweisung ist erfolgreich, da die Nullfähigkeit der Funktion - ISNULL als NICHT NULL ausgewertet wird.

CREATE TABLE #Demo 
( 
    col1 integer NULL, 
    col2 AS COALESCE(col1, 0), 
    col3 AS ISNULL(col1, 0) PRIMARY KEY 
);
  1. Die Validierungen für ISNULL und COALESCE sind ebenfalls unterschiedlich. Beispielsweise wird ein NULL-Wert für ISNULL in int konvertiert, während Sie für COALESCE einen Datentyp angeben müssen.

  2. ISNULL akzeptiert nur 2 Parameter, während COALESCE eine variable Anzahl von Parametern akzeptiert.

    Wenn Sie mehr wissen möchten, finden Sie hier das vollständige Dokument von msdn.


23

Mit coalesce:

coalesce(column_name,0)

Obwohl, wo Summieren when condition then 1, könnte man genauso leicht ändern sumzu count- zB:

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

( Count(null)gibt 0 zurück, während sum(null)null zurückgegeben wird.)


10

Wenn Sie die ersten drei Spalten sagen, meinen Sie damit Ihre SUMSpalten? Wenn ja, fügen Sie ELSE 0Ihren CASEAussagen hinzu. Die SUMvon einem NULLWert ist 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

Ein einfacher Weg ist

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL

7

Schließen Sie Ihre Spalte in diesen Code ein.

 ISNULL(Yourcolumn, 0)

Überprüfen Sie möglicherweise, warum Sie Nullen erhalten


6

Use COALESCE, das den ersten Nicht-Null-Wert zurückgibt, z

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

Setzt Succeeded auf 0, wenn es als zurückgegeben wird NULL.


1

Fügen Sie Ihren case-Anweisungen ein else hinzu, sodass sie standardmäßig Null sind, wenn die Testbedingung nicht gefunden wird. Im Moment, wenn die Testbedingung nicht gefunden wird, wird NULL an die Funktion SUM () übergeben.

  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

Wenn Sie Presto, AWS Athena usw. verwenden, gibt es keine ISNULL () -Funktion. Verwenden Sie stattdessen:

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, 

Das Problem hierbei ist, dass Sie ohne die else-Anweisung eine Null erhalten müssen, wenn der Ausführungsstatus nicht dem in der Spaltenbeschreibung angegebenen Status entspricht. Das Hinzufügen von irgendetwas zu Null führt zu Null, und das ist das Problem bei dieser Abfrage.

Viel Glück!


0

Durch das Befolgen früherer Antworten verlor ich meinen Spaltennamen in der SQL Server-Datenbank. Das Befolgen dieser Syntax half mir jedoch, auch den Spaltennamen beizubehalten

ISNULL(MyColumnName, 0) MyColumnName
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.