where子句中的NULL值

时间:2016-09-10 01:31:12

标签: sql sql-server-2012

在存储过程中,我有这个查询

DECLARE @BadRowsCount int;
SET @BadRowsCount = 0;

SELECT @BadRowsCount = COUNT(*) 
FROM #ImportTemp
WHERE #ImportTemp.Status <> 'A' AND #ImportTemp.Status <> 'B'

@BadRowsCount如果#ImportTemp.Status中的值不同于A或B,则值为正值。

但如果在#ImportTemp.Status中为NULL @BadRowsCount为0.

为什么呢? NULL与A或B没有区别?

状态定义为:

[Status] [varchar](80) NULL

我必须定义WHERE子句,如:

WHERE (#ImportTemp.Status <> 'A' AND #ImportTemp.Status <> 'B') OR #ImportTemp.Status is NULL

2 个答案:

答案 0 :(得分:2)

默认情况下,在SQL Server中,如果任一值为null,则比较运算符将返回UNKNOWN(即,不为true或false)。

MSDN IS [NOT] NULL文档

有很多方法可以改变SQL Server处理与SET ANSI_NULLS之类的内容进行空比较的方式。绝对要注意即将对此值的默认值进行更改。

这是一个interesting article,它涵盖了与空值处理相关的几个问题。

答案 1 :(得分:1)

因为不等于运算符(<>)与大多数运算符一样,不是 NULL save 。这意味着当与NULL比较时,它会导致 unknown