MyNullableCol <> «MyValue» не включает строки, в которых MyNullableCol имеет значение NULL - PullRequest
0 голосов
/ 14 января 2010

Сегодня я обнаружил странную проблему: у меня есть таблица с обнуляемым столбцом, и я попытался использовать следующий запрос

ВЫБРАТЬ * Я бы, MyNCol, ОТ dbo. [MyTable] ГДЕ MyNCol <> 'MyValue'

И ожидаем, что он вернет все строки, не имеющие значения 'MyValue' в поле MyNCol. Но он не возвращает все строки, содержащие NULL в указанном выше столбце (MyNCol). Поэтому я должен переписать мой запрос на

ВЫБРАТЬ * Я бы, MyNCol, ОТ dbo. [MyTable] ГДЕ MyNCol <> 'MyValue' ИЛИ ​​MyNCol НЕДЕЙСТВИТЕЛЕН *

Теперь мой вопрос: почему первого запроса недостаточно, чтобы выполнить то, что я хочу? (

С уважением Mubashar

Ответы [ 3 ]

1 голос
/ 14 января 2010

Посмотрите на поведение "ANSI NULLs".

Стандартно, NULL! = NULL.Вы можете изменить это поведение, изменив свойство ANSI NULLS в вашей базе данных, но это имеет далеко идущие последствия для хранения столбцов и выполнения запросов.В качестве альтернативы вы можете использовать оператор SET ANSI_NULLS в своем скрипте SQL.

Документация MSDN для SQL Server 2008 находится здесь: SET ANSI_NULLS (Transact-SQL)

Обратите особое внимание на детали того, как выполняется сравнение - даже если параметр ANSI_NULLS выключен, сравнения столбцов и столбцов могут работать не так, как вы предполагали.Лучше всего всегда использовать IS NULL и NOT NULL.

0 голосов
/ 14 января 2010

NULL = НЕИЗВЕСТНО.Таким образом, вы не можете сказать, что MyNCol = 'My Value' или MyNCol <> 'My Value' - оба имеют значение UNKNOWN (точно так же, как 'foo' + MyNCol все равно станет NULL).Альтернатива опубликованному вами обходному пути:

WHERE COALESCE(MyNCol, 'Not my Value') <> 'My Value';

Это будет включать столбцы NULL, потому что сравнение становится ложным, а не неизвестным.Мне эта опция не нравится больше, потому что в сравнении она использует какое-то магическое значение, даже если это магическое значение будет предоставлено только тогда, когда столбец равен NULL.

0 голосов
/ 14 января 2010

Операторы равенства не могут выполняться с нулевыми значениями. В SQL 2000 можно было проверить null = null, однако в 2005 году это изменилось.

...