sqlserver - sql if null then 0
compruebe si hay una fecha nula en la sentencia CASE, ¿dónde me he equivocado? (2)
Mi tabla de origen se ve así
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Quiero crear una declaración de selección, que selecciona lo anterior, pero también tiene una columna adicional para mostrar un varchar si la fecha no es nula, como:
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
Tengo lo siguiente en mi selección, pero no parece estar funcionando. Todos los estados están configurados en Approved
aunque las fechas tienen algunos 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 un tiempo smalldatetime
, ¿hay alguna excepción a cómo debe tratarse esto?
Gracias
Tratar:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN ''Awaiting''
ELSE ''Approved'' END AS StartDateStatus
FROM myTable
Tu código habría estado haciendo un When StartDate = NULL, creo.
NULL
nunca es igual a NULL
(ya que NULL es la ausencia de un valor). NULL
tampoco es igual a NULL
. La sintaxis mencionada anteriormente es el estándar ANSI SQL y la inversa sería StartDate IS NOT NULL
.
Puede ejecutar lo 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 vuelve:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Para completar, en SQL Server puede:
SET ANSI_NULLS OFF;
Lo que daría lugar a que las comparaciones entre iguales funcionen 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 recomiendo encarecidamente no hacer esto. Las personas que posteriormente mantengan su código podrían verse obligadas a cazarle y hacerle daño ...
Además, ya no funcionará en las próximas versiones del servidor SQL:
select Id, StartDate,
Case IsNull (StartDate , ''01/01/1800'')
When ''01/01/1800'' then
''Awaiting''
Else
''Approved''
END AS StartDateStatus
From MyTable