Verifique a data nula na declaração, onde eu dava errado?
-
20-09-2019 - |
Pergunta
Minha mesa de origem se parece com isso
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Quero criar uma instrução SELECT, que selecione o acima, mas também possui uma coluna adicional para exibir um Varchar se a data não for nula como:
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
Eu tenho o seguinte em minha seleção, mas não parece estar funcionando. Todos os status estão definidos como Approved
Mesmo que as datas tenham alguns nulos
select
id,
StartDate,
CASE StartDate
WHEN null THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Os resultados da minha consulta parecem:
Id StartDate StartDateStatus
1 (null) Approved
2 12/12/2009 Approved
3 10/10/2009 Approved
4 (null) Approved
5 (null) Approved
StartDate é a smalldatetime
, existe alguma exceção de como isso deve ser tratado?
Obrigado
Solução
Tentar:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Você code estaria fazendo um quando startDate = null, eu acho.
NULL
nunca é igual a NULL
(como nulo é a ausência de um valor). NULL
também nunca é igual a NULL
. A sintaxe mencionada acima é o padrão ANSI SQL e o inverso seria StartDate IS NOT NULL
.
Você pode executar o seguinte:
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 isso retorna:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Para completar, no SQL Server, você pode:
SET ANSI_NULLS OFF;
O que resultaria em suas iguais comparações funcionando de maneira diferente:
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
Que retorna:
EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1
Mas eu recomendo contra fazer isso. As pessoas posteriormente mantêm seu código pode ser obrigado a caçá -lo e machucá -lo ...
Além disso, ele não funcionará mais nas próximas versões do SQL Server:
Outras dicas
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable