2010-03-16 9 views
25

Mi tabla de origen tiene este aspectocomprobar la fecha nula en la declaración CASE, ¿dónde me he equivocado?

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

que desee 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 lo siguiente en mi selección, pero parece que no funciona. 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 parecen:

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 smalldatetime, ¿hay alguna excepción a cómo debe ¿ser tratado?

Gracias

Respuesta

58

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). NULL tampoco es igual a NULL. La sintaxis indicada anteriormente es el estándar ANSI SQL y la inversa 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; 

que resultaría en sus comparaciones de igualdad de trabajo diferente ntly:

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 cazar abajo y se le daño ...

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

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

+0

¿Por qué la "ColumnName = NULL" no funciona? ¿Por qué tal sintaxis no es aceptada? –

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

Si StartDate = '01/01/1800 ', el resultado será' En espera '. – Xordal

Cuestiones relacionadas