Почему сравнение переменной даты 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.