sql - 不使用组时解释 COUNT 返回值
问题描述
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) 计算组中每一行的表达式,并返回非空值的数量。
因此,它们被评估,它们返回NULL
s 并且由于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
?
解决方案
在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;
到脚本的开头。
推荐阅读
- javascript - Passing props back everytime a from is submitted in React
- python - 分离重复列值
- babylonjs - Cannot find module 'babylonjs'
- node.js - 如何防止老练的攻击者知道您的应用在生产环境中由 Express.js 提供支持?
- javascript - How to send a file in array of object to express server?
- c# - 如何将 ADFS 用户添加到 Identity 中的“AspNetUsers”?
- javascript - 在Angular中先前的响应之后执行一个函数
- git - 在 Git 的根提交之前插入一个非空提交?
- r - Is there any R code to repeat a same value for multiple rows?
- javascript - Can you style an element with JavaScript without adding a style attribute?