НЕ влияет на выход

У меня довольно простой сценарий, но в одном поле (person_name) есть имена некоторых тестовых пользователей (например, «Джон Смит»), которые я хочу исключить из создаваемого отчета. Поле также имеет некоторые нулевые значения, которые я хочу сохранить в отчете.

Я вставил:

И имя_человека НЕ ​​В («Джон Смит», «Салли Браун») и т. д.

Это удаляет имена из отчета, но по какой-то причине также удаляет значения NULL из person_name. Как уже упоминалось, я хочу сохранить значения NULL.

Мой вопрос: есть ли простая причина, по которой NULL исчез из отчета, как только я начинаю блокировать определенные имена?

Я довольно озадачен этим, и любые указатели будут оценены.

Спасибо.


person Will F    schedule 25.02.2015    source источник


Ответы (2)


Для работы с NULL SQL использует трехзначную логику, что означает, что предикаты могут оцените значение True, False или Unknown. Поскольку метка NULL может представлять либо значение, которое в настоящее время неизвестно, либо значение, которое не существует, сравнение чего-либо с NULL оценивается как неизвестное.

Возвращаясь к вашему предикату выше и предполагая, что он является частью предложения WHERE, будут возвращены только строки, которые оценивают person_name NOT IN ('john smith', 'sally brown') как True. Поскольку строки NULL оцениваются как неизвестные, они исключаются из набора результатов.

Чтобы убедиться, что строки NULL включены, вы можете добавить для них специальную проверку, например:

WHERE (person_name NOT IN ('john smith', 'sally brown') OR person_name IS NULL)

См. также раздел NULL и трехзначной логики этого SQL Server. Профессиональная статья и замечательный пост Quassnoi на его сайте ExplainExtended.

person stubaker    schedule 25.02.2015
comment
Спасибо, что нашли время и усилия, чтобы так полно ответить на мой вопрос. Очень четкое объяснение, и теперь я понимаю о null гораздо больше, чем раньше. Ссылки также очень полезны. - person Will F; 26.02.2015

Всякий раз, когда я пытался использовать фильтры типа NOT IN/NOT LIKE в SSRS, я всегда сталкивался с множеством странных ситуаций, подобных этой. Попробуйте следующее в своем выражении:

=IIf(IsNothing(Fields!yourfield.Value)=True, "testguy", Fields!yourfield.Value)

вместо того, чтобы просто

[yourfield]

Оставьте оператор и значение одинаковыми.

person Jeffrey Van Laethem    schedule 25.02.2015
comment
Спасибо Джеффри. Я обнаружил, что сообщение выше сделало то, что мне нужно, чтобы отчет работал сам по себе, но я не знал, что могу использовать IIf так, как вы предложили, поэтому я тоже кое-что узнал. Спасибо. - person Will F; 26.02.2015