为什么count(1 / null)有效,而count(null / null)不起作用?

时间:2019-10-18 07:45:51

标签: sql-server tsql null

我最近在演示中看到了这个例子。当您运行这样的查询时:

SELECT COUNT(NULL)

您收到以下错误:

  

操作数数据类型NULL对计数运算符无效。

运行此命令时:

SELECT COUNT(1/NULL)

即使除法结果本身为NULL,结果还是为0。如果交换1和NULL,也会发生同样的情况。

但是,如果您这样做:

SELECT COUNT(NULL/NULL)

您再次遇到与第一个查询相同的错误(除法本身是合法的,产生NULL)。

谁能解释sql server如何提供此类结果?

3 个答案:

答案 0 :(得分:7)

在SQL Server中,某些聚合函数(例如COUNT,MIN,MAX)和函数(例如DATEADD)需要数据类型。 NULL本身没有一个,因此会给您一个错误:

SELECT COUNT(NULL) -- Operand data type NULL is invalid for count operator.

与之类似:

SELECT COUNT(NULL/NULL)

对于1/NULL,数据类型为INT,值为NULL,因此可以正常工作:

SELECT COUNT(1/NULL) -- 0

与之类似:

SELECT COUNT(CAST(NULL AS INT)) -- 0

答案 1 :(得分:1)

这实际上是编译器错误。当您运行批处理时,将分析T-SQL,并在 而非执行时绘制语句SELECT COUNT(NULL);SELECT COUNT(NULL/NULL);的错误。 / p>

如果您在下面运行该批处理,您将很快看到:

PRINT 'testing 1'

SELECT COUNT(NULL); --Error at compile
GO

PRINT 'testing 2'

SELECT COUNT(1/NULL); --Runs
GO

PRINT 'testing 3'

SELECT COUNT(NULL/NULL);  --Error at compile
GO

PRINT 'testing 4'

SELECT COUNT(0/0); --Error at run time

请注意,testing 1testing 3语句永远不会出现。

NULL本身没有数据类型。表达式的所有边均为NULL的表达式实际上将具有未知的数据类型。

如果要为NULL设置数据类型,则不会发生此问题:

PRINT 'testing 5'

SELECT COUNT(CONVERT(int,NULL));
GO

PRINT 'testing 6'
DECLARE @N int;

SELECT COUNT(@N);

答案 2 :(得分:0)

问题在于所涉及的数据类型。如果运行以下命令,我们可以看到仅NULL没有数据类型:

SELECT SQL_VARIANT_PROPERTY(NULL,'BaseType')

与您看到的错误相对应。

我们可以使用强制转换将NULL设置为选定的数据类型,在这种情况下,错误将得到解决:

SELECT COUNT(cast(NULL as int))