wake-up-neo.com

In CASE-Anweisung auf Null-Datum prüfen, wo habe ich mich geirrt?

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

31
Jimmy

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:

https://msdn.Microsoft.com/en-GB/library/ms188048.aspx

71
Paddy
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
3
Bubba