有了这个选择:
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},...]
而不是包含标签的整个对象作为它的属性:
答案 0 :(得分:1)
如果我理解正确,您的情况如下:
您的源表包含 id
、keys
和 values
,如下所示
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)