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 ce qui précède, mais a également une colonne supplémentaire pour afficher un varchar si la date n'est pas nulle, comme:
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
J'ai les éléments suivants dans ma sélection, mais cela ne semble pas fonctionner. Tous les statuts sont définis sur 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 requête 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
, y a-t-il une exception à la façon dont cela doit être traité?
Merci
Essayer:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Votre code aurait fait un When StartDate = NULL, je pense.
NULL
n'est jamais égal à NULL
(car NULL est l'absence de valeur). NULL
n'est également jamais différent de NULL
. La syntaxe indiquée ci-dessus est la norme ANSI SQL 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 renvoie:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Pour être complet, dans SQL Server, vous pouvez:
SET ANSI_NULLS OFF;
Ce qui entraînerait que vos comparaisons égales fonctionnent différemment:
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
Qui retourne:
EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1
Mais je recommanderais fortement de ne pas le faire. Les gens qui maintiennent votre code par la suite pourraient être contraints de vous traquer et de vous blesser ...
En outre, il ne fonctionnera plus dans les prochaines versions de SQL Server:
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable