我有一个包含JSON数组的JSONB
列。我现在需要将所有行中的所有不同值合并为一个单独的数组。
输入:
id | values
-----------
1 | [x, y, z]
2 | [a, b, x]
期望的输出:
result
---------------
[a, b, x, y, z]
我不能只将jsonb_agg
与DISTINCT
一起使用,因为它会返回一个二维数组,而且我找不到任何展平或连续的聚合函数。我该如何解决这个问题?
答案 0 :(得分:2)
在使用聚合之前,您应该删除数组:
with my_table(id, data) as (
values
(1, '["x", "y", "z"]'::jsonb),
(2, '["a", "b", "x"]')
)
select jsonb_agg(distinct value)
from my_table, jsonb_array_elements_text(data);
jsonb_agg
---------------------------
["a", "b", "x", "y", "z"]
(1 row)
您可以对结果进行分组:
with my_table(id, data) as (
values
(1, '["x", "y", "z"]'::jsonb),
(1, '["a", "b", "x"]'),
(2, '["1", "2", "3"]'),
(2, '["2", "3", "4"]')
)
select id, jsonb_agg(distinct value)
from my_table, jsonb_array_elements_text(data)
group by id;
id | jsonb_agg
----+---------------------------
1 | ["a", "b", "x", "y", "z"]
2 | ["1", "2", "3", "4"]
(2 rows)