空结果集的聚合

mil*_*lan 10 sql postgresql aggregate-functions

我想将空结果集的聚合为0.我尝试了以下内容:

SELECT SUM(COALESCE(capacity, 0))
  FROM objects
 WHERE null IS NOT NULL;
Run Code Online (Sandbox Code Playgroud)

结果:

sum 
-----

(1 row)
Run Code Online (Sandbox Code Playgroud)

子问题:上面的工作不会在Oracle中使用SUM(NVL(capacity, 0))吗?

And*_*y M 10

在有关聚合函数的文档页面中:

应该注意,除了之外count,这些函数在没有选择行时返回空值.特别是,sum没有行返回null,而不是正如人们所期望的那样.coalesce必要时,该函数可用于将零替换为null.

所以,如果你想保证返回的值,适用COALESCE结果SUM,而不是它的参数:

SELECT COALESCE(SUM(capacity), 0) …
Run Code Online (Sandbox Code Playgroud)

至于Oracle'子问题',我在官方文档页面(特别是10.2)中找不到任何NULL的概念,但另外两个来源是明确的:

也就是说,您无需将NVL应用于capacity.(但是,与COALESCEPostgreSQL中一样,您可能希望将其应用于SUM.)


Den*_*rdy 5

问题是,聚合总是返回一行,即使没有聚合行(如查询中的情况).你总结了一个没有行的表达式.因此,您获得的空值.

试试这个:

select coalesce(sum(capacity),0)
from objects
where false;
Run Code Online (Sandbox Code Playgroud)