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

Foi útil?

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:

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

Outras dicas

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top