Является ли Null больше любого типа данных даты? - PullRequest
13 голосов
/ 09 марта 2012

У меня есть этот запрос в DB2

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A

Если SYSDATE равно NULL, будет ли оно больше любого значения @A, предполагая, что @A и SOMESCHEMA.SOMETABLE.SYSDATE это Дата тип данных?

Пожалуйста, помогите.Заранее спасибо.

Ответы [ 3 ]

11 голосов
/ 09 марта 2012

Другим предикатом, который полезен для сравнения значений, которые могут содержать значение NULL, является предикат DISTINCT.Сравнение двух столбцов с использованием нормального равного сравнения (COL1 = COL2) будет истинным, если оба столбца содержат одинаковое ненулевое значение.Если оба столбца имеют нулевое значение, результат будет ложным, поскольку нулевое значение никогда не будет равно ни одному другому значению, даже другому нулевому значению.Используя предикат DISTINCT, нулевые значения считаются равными.Таким образом, COL1 НЕ ОТЛИЧАЕТСЯ от COL2 будет истинным, если оба столбца содержат одинаковое ненулевое значение, а также когда оба столбца имеют нулевое значение.

Обработка пустых значений в DB2

Это означает, что все операции сравнения будут ложными, потому что вы сравниваете неизвестное значение с чем-то.Поэтому независимо от того, какое сравнение вы используете (работает только операция IS NULL / IS NOT NULL!), Оно будет ложным.

Если вы хотите, чтобы запрос работал, вы должны использовать что-то вроде

SELECT * 
  FROM SOMESCHEMA.SOMETABLE 
 WHERE COALESCE(SYSDATE, TIMESTAMP_FORMAT('0001-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS'))  > @A
7 голосов
/ 08 января 2013

Другая возможность - использовать IS NULL, чтобы проверить, является ли значение нулевым:

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

будет включать значение в ваш набор возвращаемых значений вместо функции COALESCE. Это работает только в простых случаях.

1 голос
/ 31 мая 2016

Это решение можно использовать для сравнения двух обнуляемых дат (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
...