SQL Server 2008 не в нуле - PullRequest
       20

SQL Server 2008 не в нуле

1 голос
/ 10 декабря 2011

У меня была странная ошибка, когда я сделал что-то вроде следующего:

SELECT *
FROM table1
WHERE NAME COLLATE LATIN1_General_CI_AS NOT IN (select name FROM table2)

Name было nvarchar(50) null. Table2 имеет null значений в столбце name. Затем он будет сопоставлять имена, которые не существуют в table2 из-за значений null. Это означает, что это вернет 0 результатов. И если бы я сделал:

SELECT *
FROM table1
WHERE NAME COLLATE LATIN1_General_CI_AS NOT IN (
  select name FROM table2 where name is not null
)

Я бы получил некоторые результаты.

На одном столе было сопоставление Danish_Norwegian_CI_AS, а на другом latin1. Может быть, COLLATE является источником проблемы?

Может кто-нибудь объяснить, почему это происходит? Может быть, что-то с теорией множеств?

Ответы [ 3 ]

1 голос
/ 10 декабря 2011

Думаю, я бы обошел эту проблему, используя

SELECT * 
  FROM table1 t1
 WHERE NOT EXISTS ( SELECT *
                      FROM table2 t2
                     WHERE (t1.NAME COLLATE LATIN1_General_CI_AS = t2.name)
                        OR (t1.NAME IS NULL AND t2.name IS NULL))

Хотя никакой теории нет, просто практический опыт = P

1 голос
/ 10 декабря 2011

Это не имеет ничего общего с сопоставлением. Попробуйте set ansi_nulls off, и первый запрос будет работать так, как вы ожидали.

Причина в том, что когда вы пытаетесь сравнить что-либо с NULL (например, a = NULL или <> NULL), в результате получается UNKNOWN, и весь запрос не выполняется. Если для ansi_nulls установлено значение off, то при таком же сравнении будет получено значение ИСТИНА или ЛОЖЬ, и запрос «работает».

Другими словами:

WHEN a NOT IN (1, 2, null)

означает

WHEN a <> 1 AND a <> 2 AND a <> null

ГДЕ последняя часть a <> null оценивается как UNKNOWN, и запрос не может вернуть строки.

1 голос
/ 10 декабря 2011

NULL не работает, как некоторые ожидают при использовании в выражении NOT IN или NOT EXISTS.

По сути, SQL Server не может точно сказать, что что-то не входит в подмножество, если подмножество содержит NULL, поскольку NULL - это состояние с неизвестным значением.

Я не думаю, что сличение даже входит в него, запросы разные.

См. Полное объяснение NULL в NOT IN здесь.

...