Почему в SQL Server значение NULL не равно пустой строке И не равно пустой строке? - PullRequest
3 голосов
/ 29 марта 2011

Это явно не вернет строку ...

select 1 where null = ''

Но почему это также не возвращает строку?

select 1 where null <> ''

Как оба из этих ГДЕ могут быть "ложными"?

Ответы [ 7 ]

5 голосов
/ 29 марта 2011

" Как могут оба из этих ГДЕ быть" ложными "? "

Это не так!Ответ тоже не "правдивый"!Ответ «мы не знаем».

Думайте о NULL как о значении, которое вы еще не знаете.

Можете ли вы поспорить, что это ''?

Готовы поспорить, что это не ''?

Так что безопаснее объявить, что вы еще не знаете.Поэтому ответ на оба вопроса не ложный, а Я не знаю , например NULL в SQL.

3 голосов
/ 29 марта 2011

Поскольку это экземпляр SQL Server, соответствующий ANSI SQL; -)

NULL в SQL в некоторой степени похож на IEEE NaN в правилах сравнения: NaN != NaN и NaN == NaN оба имеют значение false.Для определения этих специальных значений требуется специальный оператор IS NULL в SQL (или "IsNaN" для IEEE FP).(На самом деле существует несколько способов обнаружения этих специальных значений: IS NULL/"IsNaN" - это просто чистые и простые методы.)

Однако NULL = x идет на один шаг дальше: результат NULL =/<> x не являетсяложь .Скорее, результатом выражения будет само NULL UNKNOWN.Так что NOT(NULL = '') равно также NULL НЕИЗВЕСТНО (или «ложно» в контексте «где» - см. Комментарий).Добро пожаловать в мир SQL логика трех состояний ; -)

Поскольку вопрос касается SQL Server, то для полноты: если вы работаете с "SET ANSI_NULLS OFF" - но см. Примечания / предупреждения вверху - тогда может быть достигнуто «оригинальное» поведение TSQL.

«оригинальное» поведение (это устарело ):

SET ANSI_NULLS OFF;
select 'eq' where null = '';       -- no output
select 'ne' where null <> '';      -- output: ne
select 'not' where not(null = ''); -- output: not; null = '' -> False, not(False) -> True

ANSI-NULLs поведение (по умолчанию во всех недавних, пожалуйста, используйте):

SET ANSI_NULLS ON;
select 'eq' where null = '';       -- no output
select 'ne' where null <> '';      -- no output
select 'not' where not(null = ''); -- no output; null = '' -> Unknown, not(Unknown) -> Unknown

Счастливое кодирование.

2 голосов
/ 29 марта 2011

При сравнении нулевое поведение очень странное - статья в википедии объясняет это довольно хорошо . В двух словах, а также true и false, есть неизвестное значение, которое SQL возвращает при сравнении.

1 голос
/ 29 марта 2011

Базы данных имеют так называемую трехзначную логику. Значения true, false и unknown.

Прочитайте это http://www.simple -talk.com / sql / learn-sql-server / sql-and-the-snare-of-of-трехзначная логика /

1 голос
/ 29 марта 2011

Стандарт SQL указывает, что NULL = x является ложным для всех x (даже если x само по себе NULL), а SQL Server просто следует стандарту. Если вы хотите проверить, является ли что-то или нет NULL, то вы должны использовать x IS NULL или x IS NOT NULL.

0 голосов
/ 29 марта 2011

Вероятно, получаю немного повторения здесь, но мои два цента в любом случае:

A. Пример a_horse_with_no_name (комментарий выше) очень хороший!

B. В не математических терминах NULL является неизвестным значением. Пустая строка - это строка нулевой длины, следовательно, «известное» значение. Вот почему NULL не сравнивает одинаково или не одинаково с пустой строкой.

C. Поскольку NULL представляет неизвестное, невозможно сравнить два значения NULL на равенство. Если вы не знаете значение X, и вы не знаете значение Y, то вы не знаете, равны они или нет.

0 голосов
/ 29 марта 2011

Поскольку любое сравнение с NULL возвращает false (или, если быть точным: возвращает NULL)

Поскольку NULL - это отсутствие информации, вы не можете определить, равно ли оно чему-либо или нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...