2012-03-09 20 views
10

tengo esta consulta en DB2¿Hay nulo mayor que cualquier tipo de datos de fecha?

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A 

Si el SYSDATE es NULL, sería mayor que cualquier valor de @A, suponiendo que @A y SOMESCHEMA.SOMETABLE.SYSDATE es un tipo de datos Fecha ?

Por favor ayuda. Gracias por adelantado.

+3

si DB2 tiene "ANSI NULL" semántica entonces el único operador binario que es cierto que debería ser " IS NULL ", AFAIK. –

+1

@pst DB2 [tiene ANSI] (http://www.dbforums.com/db2/765612-handing-null-values-db2.html#post2808106), ¿qué quiere decir con _ el único operador binario que es cierto debe ser "ES NULO"_ ? –

Respuesta

8

Otro predicado que es útil para comparar valores que pueden contener el valor NULL es el predicado DISTINCT. La comparación de dos columnas con una comparación igual normal (COL1 = COL2) será verdadera si ambas columnas contienen un valor igual no nulo. Si ambas columnas son nulas, el resultado será falso porque null nunca es igual a ningún otro valor, ni siquiera otro valor nulo. Con el predicado DISTINCT, los valores nulos se consideran iguales. Entonces COL1 NO ​​ES DISTINTO desde COL2 será verdadero si ambas columnas contienen un valor no nulo igual y también cuando ambas columnas son el valor nulo.

DB2 Null Handling

Eso significa que todas las operaciones de comparación serán falsos, ya que está comparando un valor desconocido a algo. Así que no importa qué comparación uses (¡solo funcionará la operación IS NULL/IS NOT NULL!), Será falsa.

Si desea que la consulta al trabajo que debe usar algo como

SELECT * 
    FROM SOMESCHEMA.SOMETABLE 
WHERE COALESCE(SYSDATE, TIMESTAMP_FORMAT('0001-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS')) > @A 
+0

Gracias por responder, pero parece un poco atenuado para mí. Dice allí: 'nulo nunca es igual a ningún otro valor', ¿es igual _equal_ con la condición más grande que _? Por favor ayuda. –

+0

He editado mi respuesta para dejar en claro que todas las comparaciones fallan si uno o ambos lados de la comparación tienen nulo incluido (a excepción de IS/IS NOT NULL). – Eggi

+1

Super duper ultra mega muchas gracias por su ayuda, pero ¿a qué se refiere con _fail_, ya que en la consulta arrojará un error? –

7

Otra posibilidad es utilizar IS NULL para probar si un valor es nulo:

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A OR SYSDATE IS NULL 

incluirá el valor de su conjunto de valores devueltos, en lugar de la función COALESCE. Sin embargo, solo funciona con casos simples.

0

Se puede utilizar esta solución para la comparación de dos fechas anulables (P.EndDate, C.EndDate):

[MinDate] = 
     CASE 
      WHEN 
       ISNULL(C.EndDate,P.EndDate) <= ISNULL(P.EndDate,C.EndDate) 
      THEN 
       ISNULL(C.EndDate,P.EndDate) 
      ELSE 
       ISNULL(P.EndDate,C.EndDate) 
     END 
Cuestiones relacionadas