2010-03-16 3 views
25

La mia tabella di origine si presenta cosìcontrollare la data null nell'istruzione CASE, dove ho sbagliato?

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

voglio creare un'istruzione select, che seleziona quanto sopra, ma ha anche una colonna aggiuntiva per visualizzare un varchar se la data non è nullo come ad esempio:

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

Ho il seguente nella mia selezione, ma non sembra funzionare. Tutti gli stati sono impostato Approved anche se le date sono alcuni valori nulli

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

i risultati della mia interrogazione assomigliano:

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

StartDate è un smalldatetime, c'è qualche eccezione a come questo dovrebbe essere trattati?

Grazie

risposta

58

Prova:

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

codice Si sarebbe fatto un Quando StartDate = NULL, credo.


NULL è mai uguale a NULL (come NULL è l'assenza di un valore). NULL non è mai uguale a NULL. La sintassi sopra riportata è ANSI SQL standard e l'inverso sarebbe StartDate IS NOT NULL.

È possibile eseguire il seguente:

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 

E questo ritorna:

EqualityCheck = 0 
InEqualityCheck = 0 
NullComparison = 1 

Per completezza, in SQL Server è possibile:

SET ANSI_NULLS OFF; 

che risulterebbe nei tuoi eguali confronti lavorativi differe nte me nte:

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 

che restituisce:

EqualityCheck = 1 
InEqualityCheck = 0 
NullComparison = 1 

Ma mi raccomando contro questo modo. La gente poi mantenendo il codice potrebbero essere costretti a caccia giù e farti del male ...

Inoltre, non sarà più operare in future versioni di SQL Server:

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

+0

Perché il "ColumnName = NULL" non funziona? Perché una tale sintassi non è accettata? –

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

Se StartDate = '01/01/1800 ', il risultato sarà' In attesa '. – Xordal