避免这种行相乘的一种方法是将每个生成的集合聚合到一个数组中。喜欢:
SELECT a.id
, ARRAY(SELECT (jsonb_array_elements(a.info -> 'attribute1') ->> 'value')::numeric) AS attribute1
, (a.info ->> 'attribute2')::numeric AS attribute2
, (a.info ->> 'attribute3')::numeric AS attribute3
, ARRAY(SELECT (jsonb_array_elements(a.info -> 'attribute4') ->> 'value')::numeric) AS attribute4
FROM ...
否则,在Postgres 10或更高版本中,最大数组中的行数与元素数一样多。请参阅:
你需要选到
numeric
到
“求和所有列的值”
因此,此备选方案将每个数组中的值相加:
SELECT a.id
, (SELECT sum((a1.elem ->> 'value')::numeric) FROM jsonb_array_elements(a.info -> 'attribute1') a1(elem)) AS attribute1
, (a.info ->> 'attribute2')::numeric AS attribute2
, (a.info ->> 'attribute3')::numeric AS attribute3
, (SELECT sum((a4.elem ->> 'value')::numeric) FROM jsonb_array_elements(a.info -> 'attribute4') a4(elem)) AS attribute4
FROM ...