Meine Quellentabelle sieht so aus
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Ich möchte eine select-Anweisung erstellen, die das Obige auswählt, aber auch eine zusätzliche Spalte zum Anzeigen eines varchar enthält, wenn das Datum nicht null ist, wie z.
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
Ich habe die folgenden in meiner Auswahl, aber es scheint nicht zu funktionieren. Alle Status werden auf Approved
gesetzt, obwohl 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 sehen folgendermaßen aus:
Id StartDate StartDateStatus
1 (null) Approved
2 12/12/2009 Approved
3 10/10/2009 Approved
4 (null) Approved
5 (null) Approved
StartDate ist ein smalldatetime
. Gibt es eine Ausnahme, wie dies behandelt werden sollte?
Vielen Dank
Versuchen:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Ihr Code hätte ein When StartDate = NULL gemacht, denke ich.
NULL
ist niemals gleich NULL
(da NULL das Fehlen eines Wertes ist). NULL
ist auch niemals ungleich NULL
. Die oben angegebene Syntax entspricht dem ANSI-SQL-Standard, und die Umkehrung wäre StartDate IS NOT NULL
.
Sie können Folgendes ausführen:
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 das gibt zurück:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Der Vollständigkeit halber können Sie in SQL Server:
SET ANSI_NULLS OFF;
Was dazu führen würde, dass Ihre Gleichheitsvergleiche anders funktionieren:
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
Welches gibt zurück:
EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1
Ich kann es aber nur wärmstens empfehlen. Leute, die später Ihren Code pflegen, könnten gezwungen sein, Sie zu jagen und Sie zu verletzen ...
Außerdem funktioniert es in zukünftigen Versionen von SQL Server nicht mehr:
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable