Поскольку это экземпляр 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
Счастливое кодирование.