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
sql
sql-server
Bhaskar Mishra
quelle
quelle
Antworten:
Wenn Sie eine möglicherweise
null
Spalte durch etwas anderes ersetzen möchten , verwenden Sie IsNull .Dies setzt eine 0 in myColumn, wenn es überhaupt null ist.
quelle
Sie können beide Methoden verwenden, es gibt jedoch Unterschiede:
Vergleich von COALESCE () und ISNULL ():
Die ISNULL-Funktion und der COALESCE-Ausdruck haben einen ähnlichen Zweck, können sich jedoch unterschiedlich verhalten.
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.
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.
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.
- Diese Anweisung ist erfolgreich, da die Nullfähigkeit der Funktion - ISNULL als NICHT NULL ausgewertet wird.
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.
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.
quelle
Mit
coalesce
:Obwohl, wo Summieren
when condition then 1
, könnte man genauso leicht ändernsum
zucount
- zB:(
Count(null)
gibt 0 zurück, währendsum(null)
null zurückgegeben wird.)quelle
Wenn Sie die ersten drei Spalten sagen, meinen Sie damit Ihre
SUM
Spalten? Wenn ja, fügen SieELSE 0
IhrenCASE
Aussagen hinzu. DieSUM
von einemNULL
Wert istNULL
.quelle
Ein einfacher Weg ist
quelle
Schließen Sie Ihre Spalte in diesen Code ein.
Überprüfen Sie möglicherweise, warum Sie Nullen erhalten
quelle
Use
COALESCE
, das den ersten Nicht-Null-Wert zurückgibt, zSetzt Succeeded auf 0, wenn es als zurückgegeben wird
NULL
.quelle
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.
quelle
Wenn Sie Presto, AWS Athena usw. verwenden, gibt es keine ISNULL () -Funktion. Verwenden Sie stattdessen:
quelle
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!
quelle
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
quelle