如何避免`select suminto`在PostgreSQL中将目标变量设置为null

问题描述

select sum()是触发功能的一部分,并且可以正常唤醒,

-- loop over all order lines without grouping
select
  sum(tp.pack_volume),sum(tp.pack_mass),sum(tl.qty_ordered),sum(tl.qty_fulfilled)
into
  new.pack_expected_volume,new.pack_expected_mass,new.qty_ordered,new.qty_fulfilled
from 
  order_lines tl
join 
  product tp on tl.product_id = tp.id
where
  tl.order_id = new.id;

-- avoid nulls if no rows in of_order_lines
new.pack_expected_volume = coalesce (new.pack_expected_volume,0);
new.pack_expected_mass = coalesce (new.pack_expected_mass,0);
new.qty_ordered = coalesce (new.qty_ordered,0);
new.qty_fulfilled = coalesce (new.qty_fulfilled,0);

但是,我必须添加那些可怕的coalesce行以检查所有汇总结果都不为空。当表order_lines中没有行时,肯定会发生这种情况。

有人知道一种更优雅/干净的方法,而无需在select之后重新检查null吗?

解决方法

只需在SELECT列表中这样做:

select
  coalesce(sum(tp.pack_volume),0),coalesce(sum(tp.pack_mass),coalesce(sum(tl.qty_ordered),coalesce(sum(tl.qty_fulfilled),0)
into
  new.pack_expected_volume,new.pack_expected_mass,new.qty_ordered,new.qty_fulfilled
from 
  order_lines tl
...

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...