为什么 COUNT() 为“NULL”聚合返回 0?

Zac*_*ith 11 null sql-server aggregate

SELECT 语句返回几行:

SELECT
  ColA
FROM
  TableA
WHERE
  ColA IS NULL
Run Code Online (Sandbox Code Playgroud)

我在 TableA 中得到 47 行的 ColA 为“NULL”。

ColA
NULL
NULL
NULL
etc...
Run Code Online (Sandbox Code Playgroud)

如果我向这个查询添加一个聚合:

SELECT
  ColA,
  COUNT(ColA) AS theCount
FROM
  TableA
WHERE
  ColA IS NULL
GROUP BY ColA
Run Code Online (Sandbox Code Playgroud)

我得到

ColA | theCount
NULL | 0
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况,我该怎么做才能避免这种情况?

a_h*_*ame 30

聚合函数忽略空值。

所以

SELECT COUNT(cola) AS thecount
FROM tablea
Run Code Online (Sandbox Code Playgroud)

相当于

SELECT count(*) AS thecount
FROM tablea
WHERE cola IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

由于您的所有值都为空,count(cola)因此必须返回零。

如果要计算空行,则需要 count(*)

SELECT cola,
       count(*) AS theCount
FROM tablea
WHERE cola is null
GROUP BY cola;
Run Code Online (Sandbox Code Playgroud)

或者更简单:

SELECT count(*) AS theCount
FROM tablea
WHERE cola is null;
Run Code Online (Sandbox Code Playgroud)

如果要在单个查询中计算 NULLNOT NULL 值,请使用:

SELECT count(cola) as not_null_count, 
       count(case when cola is null then 1 end) as null_count
FROM tablea;
Run Code Online (Sandbox Code Playgroud)

  • @ZachSmith:count(*) 不会计算“组合”。它将计算组中的行数,因为根据定义,`*` 永远不会为空。 (3认同)

ype*_*eᵀᴹ 20

这是设计使然。

COUNT(<expression>)计算<expression>不为空的行。

COUNT(*) 计数行。

因此,如果要计算行数,请使用COUNT(*).