在没有程序代码的情况下处理PostgresQL中的除法错误 - 是否可能?

时间:2015-02-23 17:42:58

标签: postgresql exception stored-procedures

我必须生成(在PostgresQL中,如果重要的话)一个包含两个和的商的列的表,基本上就像这样(非常简化):

select name, sum(a)/sum(b), sum(c)/sum(d)
from a_complex_nested_select_query_with_many_zeros
group by name
order by name;

该表有数万行(不是太大),但在少数情况下,通过b或d求和会产生0,这会导致整个查询失败并显示Divide by 0

在研究如何处理异常时,我只能找到PL/pgSQL Control Structures的信息,这似乎需要创建一个函数(但我不确定)。

我的问题当然是如何使这个查询工作。也许答案与

有关
  • 可以在非过程SQL(PostgresQL,也许是?)
  • 中捕获异常
  • 是否需要程序代码?
  • CASE..WHEN..ELSE..END结构可以避免这个问题(因为它看起来像SUM()调用一样重复了!)但它很吸引人,因为我没有对Postgres有足够的了解,以了解异常捕获是否会对性能造成损失。
  • 是否有办法在没有函数的情况下确保在CASE表达式中对SUM()进行一次计算?
  • 如果需要一个功能,它会是什么样的?

编辑通过"重复和来电"我的意思是我知道我可以写:

select name, 
    case when sum(b)=0 then null else sum(a)/sum(b) end,
    case when sum(d)=0 then null else sum(c)/sum(d) end
等等,但我不确定这是不是一件好事。 (我想有人会回答为什么 - 不要 - 你的个人资料 - 但我认为可能有更好的方法,在某处。)

1 个答案:

答案 0 :(得分:1)

如果参数相等,

nullif将返回null。 null的除法评估为null

select
    name,
    sum(a) / nullif(sum(b), 0),
    sum(c) / nullif(sum(d), 0)
from a_complex_nested_select_query_with_many_zeros
group by name
order by name;