verificare la presenza di Data nulla nella dichiarazione CASE, dove ho sbagliato?
-
20-09-2019 - |
Domanda
La mia tabella di origine si presenta così
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Voglio creare una dichiarazione prescelta, che seleziona quanto sopra, ma ha anche una colonna aggiuntiva per visualizzare un varchar se la data non è nullo, come:
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 impostati per Approved
anche se le date sono alcuni valori null
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
Data iniziale è un smalldatetime
, c'è qualche eccezione a come questo dovrebbe essere trattata?
Grazie
Soluzione
Prova:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
È il codice sarebbe stato facendo un Quando StartDate = NULL, credo.
NULL
è mai uguale a NULL
(come NULL è l'assenza di un valore). NULL
è inoltre mai non è uguale a NULL
. La sintassi è osservato in precedenza ANSI standard SQL e il contrario 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;
Il che si tradurrebbe in tuoi pari confronti di lavoro in modo diverso:
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:
Altri suggerimenti
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable