validar then sqlserver not fechas con campo sql sql-server-2005 case smalldatetime

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:

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


select Id, StartDate, Case IsNull (StartDate , ''01/01/1800'') When ''01/01/1800'' then ''Awaiting'' Else ''Approved'' END AS StartDateStatus From MyTable