Подтвердить что ты не робот

Почему null не равен null false

Я читал эту статью: Получить null == null в SQL

И консенсус заключается в том, что при попытке проверить равенство между двумя (обнуляемыми) столбцами sql правильный подход:

where ((A=B) OR (A IS NULL AND B IS NULL))

Когда A и B являются NULL, (A = B) все еще возвращает FALSE, так как NULL не равен NULL. Вот почему требуется дополнительная проверка.

Как насчет тестирования неравенства? Следуя приведенному выше обсуждению, мне показалось, что для проверки неравенства мне нужно будет сделать что-то вроде:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

Однако я заметил, что это необязательно (по крайней мере, не на informix 11.5), и я могу просто сделать:

where (A<>B)

Если A и B являются NULL, это возвращает FALSE. Если значение NULL не равно NULL, то это не должно возвращать TRUE?

ИЗМЕНИТЬ
Все это хорошие ответы, но я думаю, что мой вопрос был немного расплывчатым. Позвольте мне перефразировать:

Учитывая, что A или B могут быть NULL, достаточно ли проверить их неравенство на

where (A<>B)

Или мне нужно явно проверить его так:

WHERE ((A <> B) OR (A IS NOT NULL AND B IS NULL) OR (A IS NULL AND B IS NOT NULL))

Отправьте запрос на этот поток для ответа на этот вопрос.

4b9b3361

Ответ 1

реляционные выражения, содержащие NULL, на самом деле дают NULL снова

изменить

здесь <> обозначает произвольный двоичный оператор, NULL является заполнителем SQL, а value - любое значение (NULL не является значением):

  • NULL <> valueNULL
  • NULL <> NULLNULL

логика: NULL означает "нет значения" или "неизвестное значение", и поэтому любое сравнение с любым фактическим значением не имеет смысла.

is X = 42 true, false или unknown, если вы не знаете, какое значение (если есть) X выполняется? SQL говорит, что он неизвестен. is X = Y true, false или unknown, учитывая, что оба они неизвестны? SQL говорит, что результат неизвестен. и он говорит так для любой двоичной реляционной операции, которая является только логической (даже если в модели нет NULL).

SQL также предоставляет два унарных постфиксных оператора, IS NULL и IS NOT NULL, они возвращают TRUE или FALSE в соответствии с их операндом.

  • NULL IS NULLTRUE
  • NULL IS NOT NULLFALSE

Ответ 2

Потому что это поведение следует за установленным тернарной логикой, где NULL считается неизвестным.

Если вы думаете о NULL как неизвестном, он становится гораздо более интуитивным:

Является ли unknown a равным unknown b? Невозможно узнать, так: unknown.

Ответ 3

Все сравнения с участием null равны undefined и вычисляются как false. Эта идея, которая предотвращает оценку null как эквивалентную null, также предотвращает оценку null как НЕ эквивалентную null.

Ответ 4

Короткий ответ: NULL являются странными, они не ведут себя так, как вы ожидали.

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

http://www.oracle.com/technology/oramag/oracle/05-jul/o45sql.html

Ответ 5

Поведение (null) по умолчанию (ANSI) в выражении приведет к нулевому (есть достаточное количество других ответов в случае).

Есть, однако, некоторые случаи и оговорки о краях, которые я бы разместил при работе с MS Sql Server, которые не указаны.

  • Нули внутри оператора, который группирует значения вместе, будут считаться равными и группироваться вместе.
  • Нулевые значения внутри оператора, который их упорядочивает, будут считаться равными.
  • Нулевые значения, выбранные в инструкции, использующей разные, будут считаться равными при оценке отдельного аспекта запроса.

В SQL Server возможно переопределить логику выражения в отношении конкретного теста Null = Null, используя SET ANSI_NULLS OFF, который затем даст вам равенство между нулевыми значениями - это не рекомендуется, но существует.

SET ANSI_NULLS OFF

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end

SET ANSI_NULLS ON

select result =
    case
        when  null=null then 'eq' 
        else 'ne'
    end

Ответ 6

Ниже приведено быстрое исправление

ISNULL (А, 0) = ISNULL (В, 0)

0 можно изменить на то, что никогда не может произойти в ваших данных

Ответ 7

"Неизвестно, что равно неизвестному b? Нет способа узнать, так: неизвестно."

Вопрос: почему сравнение дает FALSE?

Учитывая трехзначную логику, было бы разумно, чтобы сравнение дало UNKNOWN (не FALSE). Но SQL действительно дает FALSE, а не UNKNOWN.

Одна из мириад извращений на языке SQL.

Кроме того, необходимо учитывать следующее:

Если "unkown" является логическим значением в тройной логике, тогда должно быть так, что сравнение равенства между двумя логическими значениями, которые оба являются (значение для) "неизвестным", то это сравнение должно привести к TRUE.

Если логическое значение само неизвестно, то, очевидно, это невозможно представить, поставив там значение "неизвестно", потому что это будет означать, что логическое значение известно ( "неизвестно" ). То есть, как реляционная теория доказывает, что реализация 3-значной логики поднимает требование для 4-значной логики, что 4-значная логика приводит к необходимости в 5-значной логике и т.д. До бесконечности.