在没有程序代码的情况下处理 PostgresQL 中的除法错误 - 这可能吗?
Dealing with division errors in PostgresQL without procedural code - is it possible?
我必须生成(在 PostgresQL 中,如果这很重要的话)一个 table 包含一个包含两个和的商的列,基本上像这样(非常简化):
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;
table 有数万行(不是太大),但在少数情况下,对 b 或 d 求和确实会产生 0,这会导致整个查询失败 Divide by 0
.
在研究如何处理异常时,我只能找到PL/pgSQL Control Structures的资料,这似乎需要创建一个函数(但我不确定)。
我的问题当然是如何使这个查询工作。也许答案与
有关
- 能否在非过程中捕获异常 SQL(也许是 PostgresQL?)
- 这是需要程序代码的情况吗?
- CASE..WHEN..ELSE..END 结构可以避免这个问题吗(我坚持这个是因为看起来 SUM() 调用是重复的!),但它很有吸引力,因为我没有足够了解 Postgres 以了解异常捕获是否会降低性能。
- 有没有办法再次在没有函数的情况下确保在 CASE 表达式中对 SUM() 求值一次?
- 如果需要一个功能,它会是什么样子?
编辑 "repeating sum calls" 我的意思是我知道我 可以 写:
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
等等,但我不确定这是否是一件好事。 (我想有人会回答为什么不分析它,但我认为在某处可能有更好的方法。)
如果参数相等,nullif
将 return 为 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;
我必须生成(在 PostgresQL 中,如果这很重要的话)一个 table 包含一个包含两个和的商的列,基本上像这样(非常简化):
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;
table 有数万行(不是太大),但在少数情况下,对 b 或 d 求和确实会产生 0,这会导致整个查询失败 Divide by 0
.
在研究如何处理异常时,我只能找到PL/pgSQL Control Structures的资料,这似乎需要创建一个函数(但我不确定)。
我的问题当然是如何使这个查询工作。也许答案与
有关- 能否在非过程中捕获异常 SQL(也许是 PostgresQL?)
- 这是需要程序代码的情况吗?
- CASE..WHEN..ELSE..END 结构可以避免这个问题吗(我坚持这个是因为看起来 SUM() 调用是重复的!),但它很有吸引力,因为我没有足够了解 Postgres 以了解异常捕获是否会降低性能。
- 有没有办法再次在没有函数的情况下确保在 CASE 表达式中对 SUM() 求值一次?
- 如果需要一个功能,它会是什么样子?
编辑 "repeating sum calls" 我的意思是我知道我 可以 写:
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
等等,但我不确定这是否是一件好事。 (我想有人会回答为什么不分析它,但我认为在某处可能有更好的方法。)
nullif
将 return 为 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;