在涉及“Null”的SQL查询中混淆返回没有选择行

时间:2011-10-21 08:43:10

标签: sql sql-server sql-server-2008 null

我对两个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

1 个答案:

答案 0 :(得分:2)

SQL使用三个有价值的逻辑(TrueFalseUnknown)。 <{1}}子句需要评估为WHERE才能返回一行。

{p> TrueSTATUS = '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') 会话选项来获取您想要的行为)