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

War es hilfreich?

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:

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

Andere Tipps

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top