大部分集合函数在进行计算时都去除NULL值,但COUNT函数是一个例外。一般情况下当对一个包含NULL值的列使用COUNT函数时,这个列中的NULL值将会被去除掉。但是如果COUNT函数使用一个星号,它就会计算所有的行,而不管其中是否包含NULL值。
如果你想使用COUNT函数计算包含NULL值的列的所有行,那么需要使用ISNULL函数。ISNULL函数能将一个NULL值以一个合法的值代替。
事实上,在有NULL值的情况下使用集合函数时,ISNULL函数是非常有用的。但记住当你使用星号时,COUNT函数将计算所有行。下面是一段示例代码,说明了NULL值对AVG和COUNT函数的影响:
SET NOCOUNT ON
GO
CREATE TABLE xCount
(pkey1 INT IDENTITY NOT NULL
CONSTRAINT pk_xCount PRIMARY KEY,
Col1 int NULL)
GO
INSERT xCount (Col1) VALUES (10)
GO
INSERT xCount (Col1) VALUES (15)
GO
INSERT xCount (Col1) VALUES (20)
GO
INSERT xCount (Col1) VALUES (NULL)
GO
SELECT AVG(Col1) AvgWithoutIsNullFunctionOnCol1,
AVG(ISNULL(Col1,0)) AvgWithIsNullFunctionOnCol1,
COUNT(Col1) NoIsNullFunctionOnCol1 ,
COUNT(ISNULL(Col1,0)) UsingIsNullFunctionOnCol1,
Count(*) UsingAsterisk
FROM xCount
GO
DROP TABLE xCount
GO
-- OUTPUT:
-- AvgWOIsNullFnctnCol1 AvgWIsNullFnctnCol1 WOIsNullFnctnCol1 WIsNullFnctnCol1 UsingAsterisk
-- -------------------- ------------------- -----------------
-- 15 11 3 4 4
