flatten / concat-aggregate JSONB数组

时间:2017-10-19 17:13:44

标签: postgresql jsonb

我有一个包含JSON数组的JSONB列。我现在需要将所有行中的所有不同值合并为一个单独的数组。

输入:

id | values
-----------
1  | [x, y, z]
2  | [a, b, x]

期望的输出:

result
---------------
[a, b, x, y, z]

我不能只将jsonb_aggDISTINCT一起使用,因为它会返回一个二维数组,而且我找不到任何展平或连续的聚合函数。我该如何解决这个问题?

1 个答案:

答案 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)