我有一个相当简单的脚本,但是一个字段(person_name)有一些测试用户的名字(例如'John Smith'),我想从我正在创建的报告中排除。该字段还有一些空值,我想保留在报告中。
我已经投入:
AND person_name NOT IN('john smith','sally brown')等。
这将从报告中删除名称,但由于某种原因,它还从person_name中删除了NULL值。如上所述,我想保留NULL值。
我的问题是,一旦我开始阻止某些名称,为什么NULL从报告中消失了?
我对此感到困惑,任何指针都会受到赞赏。
感谢。
答案 0 :(得分:1)
要使用NULL,SQL使用三值逻辑,这意味着predicates可以调整为True,False或Unknown。由于NULL标记可以表示当前未知的值或不存在的值,因此将任何内容与NULL进行比较将评估为未知。
回到上面的谓词并假设它是WHERE
子句的一部分,只返回将person_name NOT IN ('john smith', 'sally brown')
评估为True的行。由于NULL行计算为Unknown,因此它们将从结果集中排除。
为确保包含NULL行,您可以为它们添加特定的检查,如:
WHERE (person_name NOT IN ('john smith', 'sally brown') OR person_name IS NULL)
另请参阅:ExplainExtended网站上this SQL Server Pro article和Quassnoi's great post的NULL和三值逻辑部分。
答案 1 :(得分:0)
每当我尝试在SSRS中使用NOT IN / NOT LIKE类型的过滤器时,我总是遇到很多像这样的奇怪情况。在表达式中尝试以下内容:
=IIf(IsNothing(Fields!yourfield.Value)=True, "testguy", Fields!yourfield.Value)
而不仅仅是
[yourfield]
保持运算符和值相同。