问题描述
我有一个查询select * from table
的视图,该查询返回了以下数据
我想按名称相同的名称列进行分组,并合并如下所述的JSONArray列
解决方法
一种方法是取消嵌套数组,然后将它们聚合回去:
select t.id,t.name,jsonb_agg(a.e)
from the_table t
cross join lateral jsonb_array_elements(t.json_array) as a(e)
group by t.id,t.name;
如果您经常执行此操作,则自定义聚合会使其更易于使用(但可能不会更快)
create function jsonb_array_combine(p_one jsonb,p_two jsonb)
returns jsonb
as
$$
select jsonb_agg(e)
from (
select e
from jsonb_array_elements(p_one) as o(e)
union all
select e
from jsonb_array_elements(p_two) as t(e)
) t
$$
language sql
immutable;
create aggregate jsonb_array_agg(jsonb)
(
SFUNC = jsonb_array_combine(jsonb,jsonb),STYPE = jsonb
);
然后您可以像这样使用它:
select t.id,jsonb_array_agg(t.json_array)
from the_table t
group by t.id,t.name;