Является ли Null большим, чем любой тип данных даты?

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

SELECT * FROM SOMESCHEMA.SOMETABLE WHERE SYSDATE > @A

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

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

Ответ 1

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

DB2 Null Handling

Это означает, что все операции сравнения будут ложными, потому что вы сравниваете неизвестное значение с чем-то. Поэтому независимо от того, какое сравнение вы используете (работает только операция 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

Ответ 2

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

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

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

Ответ 3

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