Как работает ANSI_NULLS в TSQL? - PullRequest
4 голосов
/ 19 мая 2010

SET ANSI_NULLS OFF, похоже, дает разные результаты в TSQL в зависимости от того, сравниваете ли вы поле из таблицы или значение. Может ли кто-нибудь помочь мне понять, почему последние 2 моих запроса не дают результатов? Я не ищу решение, просто объяснение.

select 1 as 'Col' into #a
select NULL as 'Col' into #b

--This query gives results, as expected.  
SET ANSI_NULLS OFF
select * from #b
where NULL = Col

--This query gives results, as expected.
SET ANSI_NULLS OFF
select * from #a
where NULL != Col

--This workaround gives results, too.
select * from #a a, #b b
where isnull(a.Col, '') != isnull(b.Col, '')

--This query gives no results, why?
SET ANSI_NULLS OFF
select * from #a a, #b b
where a.Col != b.Col

--This query gives no results, why?
SET ANSI_NULLS OFF
select * from #a a, #b b
where b.Col != a.Col

Ответы [ 2 ]

10 голосов
/ 19 мая 2010

Причина, по которой последние два запроса завершаются неудачно, заключается в том, что SET ANSI_NULLS ON/OFF применяется только при сравнении с переменной или значением NULL. Он не применяется при сравнении значений столбцов. С БОЛ:

SET ANSI_NULLS ON влияет на сравнение только если один из операндов Сравнение является либо переменной, которая является NULL или буквальным NULL. Если оба Сторонами сравнения являются столбцы или составные выражения, настройка делает не влияет на сравнение.

0 голосов
/ 19 мая 2010

Что-либо по сравнению с нулевым значением терпит неудачу. Даже сравнение двух нулевых значений не удастся. Даже! = Потерпит неудачу из-за (IMHO) глупой обработки NULL.

Тем не менее, запросы! = Можно переписать так:

select * from #a a where a.Col not in (select b.Col from #b b)

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

Кстати, ваш обходной путь работает просто потому, что вы проверяете нулевое значение в столбце # b.Col и явно конвертируете его в «», что затем позволяет вашему запросу выполнить сравнение строк между ними. Альтернативный способ написания:

select * from #a a, #b b
where a.Col != COALESCE(b.Col, '')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...