Postgres:将 json 对象转换为键值对数组

时间:2021-03-30 11:22:43

标签: json postgresql

有了这个选择:

SELECT '{"key1": "value1", "key2": "value2"}'::jsonb

我们可以将结果对象转换为以下对象数组,分别保留它们的键和值吗?

[{"key1": "value1"}, {"key2": "value2"}]

就我而言,我有标签和操作的多对多关系,以下查询将标签聚合到每个操作的 json 对象中:

SELECT ot.operation_id, json_object_agg(t.name, t.value) AS tagsjson 
FROM tag t 
INNER JOIN operation_tag ot ON t.tag_id = ot.tag_id 
GROUP BY ot.operation_id

这很好用,除了结果的格式:我需要标签数组 [{name : value},...] 而不是包含标签的整个对象作为它的属性:

enter image description here

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您的情况如下:

您的源表包含 idkeysvalues,如下所示

create table test_k_v (id int, k varchar, v varchar);

insert into test_k_v values (1, 'key1', 'value1');
insert into test_k_v values (1, 'key2', 'value2');
insert into test_k_v values (2, 'key3', 'value3');
insert into test_k_v values (2, 'key4', 'value4');
insert into test_k_v values (2, 'key5', 'value5');

结果

defaultdb=> select * from test_k_v;
 id |  k   |   v    
----+------+--------
  1 | key1 | value1
  1 | key2 | value2
  2 | key3 | value3
  2 | key4 | value4
  2 | key5 | value5
(5 rows)

如果是这样,您可以使用以下查询创建一个包含所有标签的数组:

select id, array_agg(json_build_object(k, v)) agg_res 
from  test_k_v
group by id;

结果

 id |                                     agg_res                                     
----+---------------------------------------------------------------------------------
  2 | {"{\"key3\" : \"value3\"}","{\"key4\" : \"value4\"}","{\"key5\" : \"value5\"}"}
  1 | {"{\"key1\" : \"value1\"}","{\"key2\" : \"value2\"}"}
(2 rows)