comprobar la fecha nula en la instrucción CASE, ¿dónde he ido mal?
-
20-09-2019 - |
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
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:
Otros consejos
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable