我对两个SQL查询的结果感到困惑。提供表格内容和两个查询:
Col1 Status
---- ------
abcd "null"
abcd PENDING
defg "null"
defg PENDING
a) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg');
b) SELECT Col1, STATUS FROM TABLE_A WHERE KEY IN ('abcd','defg') and NOT (STATUS = 'PENDING')
结果(a)显示所有4行,(b)的结果显示无效!
列'状态'可以具有除'PENDING'之外的值,并且出于报告原因,我不能使用'STATUS IS NOT NULL'作为过滤器。我不明白为什么查询(b)什么都不返回。在此先感谢您的任何帮助
平台:MSSQL 2008
答案 0 :(得分:2)
SQL使用三个有价值的逻辑(True
,False
,Unknown
)。 <{1}}子句需要评估为WHERE
才能返回一行。
True
在STATUS = 'PENDING'
时返回UNKNOWN
。
如果您否定Status IS NULL
,您仍会获得Unknown
。
请参阅SQL and the Snare of Three-Valued Logic
您需要将查询重写为
Unknown
(虽然可以使用已弃用的SELECT Col1, STATUS
FROM TABLE_A
WHERE KEY IN ('abcd','defg') and (STATUS IS NULL OR STATUS <> 'PENDING')
会话选项来获取您想要的行为)