vérifier la date nulle dans l'instruction CASE, où ai-je passé?
-
20-09-2019 - |
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
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:
Autres conseils
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable