Почему сравнение переменной даты SQL с нулем ведет себя таким образом? - PullRequest
5 голосов
/ 25 января 2012

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

В моем процедуре у меня есть 2 даты, которые являются необязательными параметрами по умолчанию, равными 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 ]

13 голосов
/ 25 января 2012

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

4 голосов
/ 25 января 2012

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

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

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

...