Pregunta

Mi tabla de origen tiene este aspecto

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

Quiero crear una instrucción de selección, que selecciona la anterior, sino que también tiene una columna adicional para mostrar un varchar si la fecha no es nulo, tales como:

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

Tengo el siguiente en mi selección, pero no parece estar funcionando. Todos los estados se fijan a Approved a pesar de que las fechas tienen algunos valores nulos

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

Los resultados de mi consulta se ven como:

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

StartDate es una smalldatetime, ¿hay alguna excepción a cómo debe ser tratado?

Gracias

¿Fue útil?

Solución

Probar:

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

código habría estado haciendo un Cuando StartDate = NULL, creo.


NULL nunca es igual a NULL (como NULL es la ausencia de un valor). También NULL no es nunca es igual a NULL. La sintaxis se ha indicado anteriormente es estándar SQL ANSI y lo contrario sería StartDate IS NOT NULL.

Puede ejecutar el siguiente:

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

Y esto devuelve:

EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1

Para completar, en SQL Server puede:

SET ANSI_NULLS OFF;

lo que resultaría en tus iguales comparaciones que trabajan de manera 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 devuelve:

EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1

Pero yo recomendaría en contra de hacer esto. Las personas que mantienen su código posteriormente podrían ser obligados a cazarte y hacerte daño ...

Además, dejará de funcionar en las próximas versiones de servidor SQL:

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

Otros consejos

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top