wake-up-neo.com

Ersetzen von NULL durch in einer SQL Server-Abfrage

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

  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
132
Bhaskar Mishra

Wenn Sie eine möglicherweise null-Spalte durch eine andere ersetzen möchten, verwenden Sie IsNull .

SELECT ISNULL(myColumn, 0 ) FROM myTable

Dies wird eine 0 in myColumn setzen, wenn es an erster Stelle null ist.

314
phadaphunk

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 anders 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 Der CASE-Ausdruck regelt 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 NOT NULL-fähig angesehen .__ (vorausgesetzt, der Rückgabewert ist ein nicht-nullfähiger Wert), während COALESCE Mit Parametern, die nicht null sind, als NULL betrachtet wird. Die Ausdrücke ISNULL (NULL, 1) und COALESCE (NULL, 1), obwohl Äquivalente Unterschiedliche Werte für die Nullfähigkeit haben. 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 festlegen, damit er wie im Folgenden .__ indiziert werden kann. Beispiel.

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

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

- Diese Anweisung ist erfolgreich, da die NULL-Fähigkeit der -- ISNULL-Funktion AS NOT NULL auswertet.

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, wohingegen für COALESCE ein Datentyp angegeben werden muss.

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

    wenn du mehr wissen willst hier ist das vollständige dokument von msdn.

67

Mit coalesce:

coalesce(column_name,0)

Wenn Sie jedoch when condition then 1 summieren, können Sie sum genauso einfach in count ändern - zB:

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

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

20
user359040

Wenn Sie die ersten drei Spalten sagen, meinen Sie Ihre SUM-Spalten? Wenn ja, fügen Sie ELSE 0 zu Ihren CASE-Anweisungen hinzu. Die SUM eines NULL-Wertes 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, 
9
sgeddes

Binden Sie Ihre Spalte in diesen Code ein.

 ISNULL(Yourcolumn, 0)

Vielleicht überprüfen Sie, warum Sie Nullen erhalten

6
Bobby

Verwenden Sie COALESCE, das den ersten Nicht-Null-Wert zurückgibt, z.

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

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

5
dKen

Ein einfacher Weg ist

UPDATE tbl_name SET fild_name = value WHERE fild_name IS NULL
5
Umang Patwa

Fügen Sie Ihren case-Anweisungen ein anderes hinzu, sodass sie standardmäßig auf Null gesetzt wird, wenn die Testbedingung nicht gefunden wird. 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
Bad Wolf
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 unbedingt eine Null erhalten, wenn der Laufstatus nicht der in der Spaltenbeschreibung angegebene Status ist. Wenn Sie etwas zu NULL hinzufügen, führt dies zu NULL.

Viel Glück!

0
Krishna Chavali

indem ich vorherigen Antworten gefolgt bin, habe ich meinen Spaltennamen in der SQL Server-Datenbank verloren. Die Befolgung dieser Syntax hat mir jedoch geholfen, auch den Spaltennamen beizubehalten

ISNULL(MyColumnName, 0) MyColumnName
0
Chameleon