如果没有找到记录,则返回零

gio*_*ozh 30 sql postgresql null coalesce plpgsql

我在存储过程中有一个查询,它在表中汇总了一些值:

SELECT SUM(columnA) FROM my_table WHERE columnB = 1 INTO res;
Run Code Online (Sandbox Code Playgroud)

在此选择之后,我res用另一个查询检索的整数减去值并返回结果.如果WHERE条款得到验证,一切正常.但如果不是,我的所有函数返回都是一个空列(可能因为我试图减去一个空值的整数).

如果WHERE不满足该条款,如何使我的查询返回零?

Erw*_*ter 57

你可以:

SELECT COALESCE(SUM(columnA), 0) FROM my_table WHERE columnB = 1 INTO res;
Run Code Online (Sandbox Code Playgroud)

这恰好起作用,因为您的查询具有聚合函数,因此总是返回一行,即使在基础表中找不到任何内容也是如此.

没有聚合的普通查询在这种情况下不会返回任何行.COALESCE永远不会被召唤,也无法拯救你.在处理单个列时,我们可以包装整个查询:

SELECT COALESCE( (SELECT columnA FROM my_table WHERE ID = 1), 0)
INTO res;
Run Code Online (Sandbox Code Playgroud)

适用于您的原始查询:

SELECT COALESCE( (SELECT SUM(columnA) FROM my_table WHERE columnB = 1), 0)
INTO res;
Run Code Online (Sandbox Code Playgroud)

更多关于COALESCE()手册.
有关手册中聚合函数的更多信息.在后面这篇文章中有
更多选择:

  • @FreshPrinceOfSO更多的是"我对SQL Server的体验不好"然后"我对COALESCE的体验很糟糕".其他RDBMS中的"COALESCE"没有任何问题. (4认同)
  • @FreshPrinceOfSO:我认为应该注意,“ COALESCE”是SQL标准*的实现方式。 (2认同)
  • @IgorRomanchenko我同意;我应该更清楚了。 (2认同)