具有一个名为example_table
的表,其中一个名为example_column
的列为JSONB类型,并且该列中的每个值都是一个数组。
两行中的值分别为[1、2]和[3]
如何汇总example_column
中的值?
结果应为:[1、2、3]
我尝试使用:
select json_agg(example_column) from example_table
但是返回[[1, 2,], [3]]
答案 0 :(得分:1)
使用函数jsonb_array_elements(example_column),
示例:
with example_table(example_column) as (
values
(jsonb '[1, 2]'),
(jsonb '[3]')
)
select jsonb_agg(value)
from example_table
cross join jsonb_array_elements(example_column)
jsonb_agg
-----------
[1, 2, 3]
(1 row)
您可以定义聚合元素的排序顺序和/或删除重复项,例如:
with example_table(id, example_column) as (
values
(1, jsonb '[1, 2]'),
(2, jsonb '[3]'),
(3, jsonb '[3, 1]')
)
select
jsonb_agg(value order by id) as agg1,
jsonb_agg(value order by value) as agg2,
jsonb_agg(distinct value order by value) as agg3
from example_table
cross join jsonb_array_elements(example_column)
agg1 | agg2 | agg3
-----------------+-----------------+-----------
[1, 2, 3, 3, 1] | [1, 1, 2, 3, 3] | [1, 2, 3]
(1 row)
答案 1 :(得分:0)
如果您需要做很多事情,可以为此创建自己的聚合:
create function combine_jsonb_arrays(p_array_1 jsonb, p_array_2 jsonb)
returns jsonb
as
$$
select jsonb_agg(t.val order by t.val)
from (
select *
from jsonb_array_elements(p_array_1) as x1(val)
union all
select *
from jsonb_array_elements(p_array_2) as x2(val)
) t;
$$
language sql;
create aggregate jsonb_elements_agg(jsonb)
(
sfunc = combine_jsonb_arrays,
stype = jsonb
);
然后您可以像这样使用它:
select jsonb_elements_agg(example_column)
from example_table;