首页 > 解决方案 > 不使用组时解释 COUNT 返回值

问题描述

COUNT返回在组中找到的项目数,默认情况下它包括 NULL 值和重复项。

前两个语句返回错误,后两个 - NULL

1/0
1/'A'
1/NULL
NULL/1

但包裹在COUNT他们返回10

SELECT COUNT(1/0);    -- 1
SELECT COUNT(1/'A');  -- 1
SELECT COUNT(1/NULL); -- 0
SELECT COUNT(NULL/1); -- 0

这些NULL案例可以由文档解释为

COUNT(ALL expression) 计算组中每一行的表达式,并返回非空值的数量。

因此,它们被评估,它们返回NULLs 并且由于non null值只是计数,我们得到0

我想知道为什么前两个返回1

将值放在表中,一切看起来都很正常 - 抛出错误并且没有返回值:

DECLARE @DataSource TABLE
(
    [valueA] INT
   ,[valueB] INT
);

INSERT INTO @DataSource ([valueA],[valueB])
VALUES (1, 0);

SELECT COUNT([valueA]/[valueB])
FROM @DataSource;

(受影响的 1 行)消息 8134,级别 16,状态 1,行 16 遇到除以零错误。

完成时间:2020-03-22T13:47:44.5512536+02:00

也许这1 row affected被返回为COUNT

标签: sqlsql-servertsqlgroup-bycount

解决方案


COUNT表达式中指定常量时,SQL Server 可以在编译时优化查询,避免在执行时计算表达式。结果值永远不会出现NULL在前 2 个查询中,并且始终会出现NULL在最后 2 个查询中。

以下是SELECT COUNT(1/0)SELECT COUNT(1/NULL)执行计划的片段:

<ScalarOperator ScalarString="Count(*)">
<Const ConstValue="NULL" />

客户端工具 (SSMS) 生成的“1 行受影响”消息,反映INSERT语句返回的行数。如果不需要,请添加SET NOCOUNT ON;到脚本的开头。


推荐阅读