Почему сравнение переменной даты SQL с нулем ведет себя таким образом?

Я только что натолкнулся на интересную проблему с процедурой, которую я пишу в SQL.

В моем процессе у меня есть 2 даты, которые являются необязательными параметрами по умолчанию, равными NULL. Я хочу проверить, не являются ли эти параметры ненулевыми, и если они не являются частью моего процесса, если они равны NULL, то дополнительная часть процесса игнорируется.

Я сделал довольно простой IF(@dateVariable <> NULL AND @DateVariable2 <> NULL) оператор, но оператор if никогда не работает, даже если переменные не равны NULL, я бы предположил, что SQL пытается сравнить дату с NULL, что странно, поскольку datetime обнуляется.

Чтобы обойти это, я просто сделал IF(DateVariable IS NOT NULL) который работает правильно. Я тоже пробовал IF( ISNULL(@DateVariable,'') <> '') который также работает правильно

Итак, мой вопрос: почему первый IF не работает, а второй и третий IF оба работают, так как оба должны в какой-то момент сравнить содержимое переменной с нулем?

Пример:

----- терпит неудачу -----

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date <> NULL)
BEGIN
    print('a')
END

----- Работает -----

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (ISNULL(@Date,'') <> '')
BEGIN
    print('a')
END

DECLARE @Date DATETIME
SET @Date = CURRENT_TIMESTAMP

IF (@Date IS NOT NULL)
BEGIN
    print('a')
END

2 ответа

Решение

Проще говоря, NULL не равно NULL. "NULL" сравнимо с состоянием неопределенности, когда одна вещь, которая является неопределенной, не обязательно равна другой, которая также является неопределенной. Используйте 'IS NULL', 'ISNULL()' или 'COALESCE()' при тестировании на нулевые значения. Отключение ANSI_NULLS может изменить это поведение, но это не стандарт ANSI SQL. См. http://msdn.microsoft.com/en-us/library/ms191270.aspx для получения дополнительной информации.

Необходимо соблюдать осторожность при сравнении нулевых значений. Поведение сравнения зависит от настройки опции SET ANSI_NULLS.

Когда SET ANSI_NULLS имеет значение ON, сравнение, в котором одно или несколько выражений равно NULL, не дает ни TRUE, ни FALSE; это приводит к НЕИЗВЕСТНО. Это связано с тем, что неизвестное значение нельзя логически сравнить с любым другим значением. Это происходит, если выражение сравнивается с литералом NULL или если сравниваются два выражения и одно из них оценивается как NULL.

См. Условия поиска сравнения NULL

Другие вопросы по тегам