当没有匹配记录时,为什么 SELECTing sum() 返回 null 而不是 0?

Kla*_*ang 6 postgresql null database-design coalesce

这只是无数让我一直感到沮丧的小细节之一,迫使我记住各种特殊代码,并导致我的查询变得比应有的更难看。

尝试以下查询来获取大小:

SELECT sum(amount) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

如果它找不到sum()该数量的记录,它将返回空/空/未定义而不是 0,导致我的应用程序中的输出意外为空,而不是零的“总和”。但是sum()意味着“总和”,那么为什么不直接返回 0呢?

我知道解决方案。你“简单地”做:

SELECT COALESCE(sum(amount), 0) FROM table WHERE conditions;
Run Code Online (Sandbox Code Playgroud)

现在即使没有记录也会返回0。但它很丑,而且用起来不再感觉“有趣”。并不是说数据库应该是一个“有趣的游戏”,但你知道我的意思:如果查询变得过于复杂/“丑陋”,那么使用它就不再令人满意,特别是如果你知道这必须是在各种地方重复出现,这不仅仅是一些晦涩难懂的、一次性的边缘案例。

让它表现成这样的背后的思考过程是什么?我还有许多与 相关的其他问题null,但对于这个问题,我将重点关注这一件事。

mus*_*cio 10

这是由 SQL 标准第4.16.4 节聚合函数指定的:

如果没有行符合条件,则 COUNT 的结果为 0(零),任何其他聚合函数的结果均为空值。


Phi*_* W. -1

如果它找不到 sum() 金额的记录,它将返回空/null/未定义而不是 0,导致我的应用程序中的输出意外为空,而不是零的“总和”。但 sum() 的意思是“总和”,那么为什么不直接返回 0呢?

仅仅是因为:

NULL  !=  0 
Run Code Online (Sandbox Code Playgroud)

NULL 不是任何类型的默认值,也不是任何类型的已知值。这是有意记录任何有意义的价值缺失
的方式。

NULL 的总和为 NULL。任何
针对 NULL 的聚合函数 的结果都是 NULL。对 NULL进行任何操作的 结果都是 NULL。

这是一个“有趣”的:
NULL 不“等于”其他任何东西,甚至 NULL本身也不“等于” !

NULL is NULL    True
NULL =  NULL    False
NULL != NULL    False
Run Code Online (Sandbox Code Playgroud)

  • *“任何针对 NULL 的聚合函数的结果都是 NULL。”*:不相关。总和针对一组空行,不涉及 NULL 值。 (2认同)
  • NULL = NULL 不是 False,而是 NULL。与<>相同 (2认同)