web-dev-qa-db-fra.com

vérifier la date nulle dans la déclaration CASE, où je me suis trompé?

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

31
Jimmy

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:

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