2010-03-16 4 views
25

Ma table source ressemble à cevérifier la date nulle dans l'instruction CASE, où ai-je mal tourné?

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 

J'ai ce qui suit dans ma sélection, mais cela 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

Répondre

58

Essayez:

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

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


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

Vous pouvez exécuter les éléments suivants:

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; 

qui résulterait dans vos comparaisons égales travaillant différemment ntly:

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 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

+0

Pourquoi la "ColumnName = NULL" ne fonctionne pas? Pourquoi une telle syntaxe n'est pas acceptée? –

3
select Id, StartDate, 
Case IsNull (StartDate , '01/01/1800') 
When '01/01/1800' then 
    'Awaiting' 
Else 
    'Approved' 
END AS StartDateStatus 
From MyTable 
+0

Si StartDate = '01/01/1800 ', le résultat sera' En attente '. – Xordal

Questions connexes