Check für null Datum in CASE-Anweisung, wo habe ich falsch gelaufen?
-
20-09-2019 - |
Frage
Meine Quelltabelle sieht wie folgt aus
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Ich mag eine select-Anweisung erstellen, dass wählt die oben, hat aber auch eine zusätzliche Spalte eine varchar angezeigt werden, wenn das Datum nicht gleich Null ist, wie:
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
Ich habe im Anschluss an den in meinem wählen, aber es scheint nicht zu funktionieren. Alle der Status auf Approved
eingestellt werden, auch wenn die Daten einige Nullen haben
select
id,
StartDate,
CASE StartDate
WHEN null THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Die Ergebnisse meiner Abfrage wie folgt aussehen:
Id StartDate StartDateStatus
1 (null) Approved
2 12/12/2009 Approved
3 10/10/2009 Approved
4 (null) Approved
5 (null) Approved
Startdatum ist ein smalldatetime
, ist es eine Ausnahme, wie sollte diese behandelt werden?
Danke
Lösung
Versuchen Sie:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Sie würden Code ein getan haben, wenn Startdate = NULL, denke ich.
NULL
ist nie gleich NULL
(als NULL das Fehlen eines Wertes ist). NULL
ist auch nie nicht zu NULL
gleich. Die Syntax oben erwähnt ist ANSI SQL-Standard und das Gegenteil wäre StartDate IS NOT NULL
.
können Sie führen die folgenden Schritte aus:
SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison
Und diese Rückkehr:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Für die Vollständigkeit, in SQL Server können Sie:
SET ANSI_NULLS OFF;
, die in ihrem Gleichen Vergleich arbeiten anders führen würden:
SET ANSI_NULLS OFF
SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison
Welche Renditen:
EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1
Aber ich würde empfehlen diese gegen tun. anschließend Ihren Code Aufrechterhaltung Menschen könnten gezwungen sein, Sie zu jagen und verletzen Sie ...
Auch ist es nicht mehr funktioniert in der kommenden Versionen von SQL Server:
Andere Tipps
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable