COUNT返回在组中找到的项目数,默认情况下它包括 NULL 值和重复项。
前两条语句返回错误,后两条语句返回错误 - NULL
:
1/0
1/'A'
1/NULL
NULL/1
但包裹在
COUNT
他们返回 1
和 0
:SELECT COUNT(1/0); -- 1
SELECT COUNT(1/'A'); -- 1
SELECT COUNT(1/NULL); -- 0
SELECT COUNT(NULL/1); -- 0
NULL
案例可以由文档解释为COUNT(ALL expression) evaluates expression for each row in a group, and returns the number of nonnull values.
因此,评估后,它们返回
NULL
s 和 as 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 row affected) Msg 8134, Level 16, State 1, Line 16 Divide by zero error encountered.
Completion time: 2020-03-22T13:47:44.5512536+02:00
也许这个
1 row affected
返回为 COUNT
?
最佳答案
当在 COUNT
中指定常量时表达式,SQL Server 可以在编译时优化查询,避免在执行时计算表达式。结果值永远不会是 NULL
在前 2 个查询中,将始终为 NULL
在最后 2 个查询中。
以下是来自 SELECT COUNT(1/0)
的片段和 SELECT COUNT(1/NULL)
执行计划:
<ScalarOperator ScalarString="Count(*)">
<Const ConstValue="NULL" />
客户端工具 (SSMS) 生成的“1 行受影响”消息,反射(reflect)了
INSERT
返回的行数陈述。如果不需要,添加 SET NOCOUNT ON;
到脚本的开头。
关于sql - 解释不带组使用时的 COUNT 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60798939/