Question

Ma table source ressemble à ceci

Id     StartDate
1      (null)
2      12/12/2009
3      10/10/2009

Je veux créer une instruction select, qui sélectionne ci-dessus, mais a également une colonne supplémentaire pour afficher une varchar si la date est non nul comme:

Id     StartDate    StartDateStatus
1      (null)       Awaiting
2      12/12/2009   Approved
3      10/10/2009   Approved

Je suit dans ma sélection, mais il ne semble pas fonctionner. Tous les statuts sont mis à Approved même si les dates ont des valeurs nulles

        select
             id,
             StartDate,
        CASE StartDate
        WHEN null THEN 'Awaiting'
        ELSE 'Approved' END AS StartDateStatus
        FROM myTable

Les résultats de ma recherche ressemblent:

Id     StartDate    StartDateStatus
1      (null)       Approved
2      12/12/2009   Approved
3      10/10/2009   Approved
4      (null)       Approved
5      (null)       Approved

StartDate est un smalldatetime, est-il une exception à la façon dont cela devrait être traité?

Merci

Était-ce utile?

La solution

Essayez:

select
     id,
     StartDate,
CASE WHEN StartDate IS NULL
    THEN 'Awaiting'
    ELSE 'Approved' END AS StartDateStatus
FROM myTable

Code aurait été fait un Lorsque StartDate = NULL, je pense.


NULL est jamais égal à NULL (comme NULL est l'absence d'une valeur). NULL est égal à ne pas NULL. La syntaxe est indiqué ci-dessus ANSI SQL standard et l'inverse serait StartDate IS NOT NULL.

Vous pouvez exécuter ce qui suit:

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

Et cela retourne:

EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1

Pour être complet, dans SQL Server, vous pouvez:

SET ANSI_NULLS OFF;

Ce qui donnera vos égaux des comparaisons de travail différentes:

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

Ce qui renvoie:

EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1

Mais je recommande fortement contre faire. Les gens en maintenant ensuite votre code pourrait être obligé de vous traquer et vous blesser ...

En outre, il ne fonctionnera plus dans les prochaines versions de SQL Server:

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

Autres conseils

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top