Arrays 连接postgresql json数组中对象的字符串值
我有一个带有json列的postgresql表,该列中填充了嵌套在数组中的对象。现在,我想构建一个查询,返回json列中对象的id和串联字符串值。PostgreSQL版本是9.5 示例数据Arrays 连接postgresql json数组中对象的字符串值,arrays,json,postgresql,Arrays,Json,Postgresql,我有一个带有json列的postgresql表,该列中填充了嵌套在数组中的对象。现在,我想构建一个查询,返回json列中对象的id和串联字符串值。PostgreSQL版本是9.5 示例数据 CREATE TABLE test ( id integer, data json ); INSERT INTO test (id, data) VALUES (1, '{ "info":"a", "items":[ { "name":"a_1" },
CREATE TABLE test
(
id integer,
data json
);
INSERT INTO test (id, data) VALUES (1, '{
"info":"a",
"items":[
{ "name":"a_1" },
{ "name":"a_2" },
{ "name":"a_3" }
]
}');
INSERT INTO test (id, data) VALUES (2, '{
"info":"b",
"items":[
{ "name":"b_1" },
{ "name":"b_2" },
{ "name":"b_3" }
]
}');
INSERT INTO test (id, data) VALUES (3, '{
"info":"c",
"items":[
{ "name":"c_1" },
{ "name":"c_2" },
{ "name":"c_3" }
]
}');
与预期示例不完全一样
到目前为止,我已经能够从表中获取值,不幸的是,没有将字符串添加到另一个表中
SELECT
row.id,
item ->> 'name'
FROM
test as row,
json_array_elements(row.data #> '{items}' ) as item;
这将输出:
id | names
----------
1 | a_1
1 | a_2
1 | a_3
2 | b_1
2 | b_2
2 | b_3
3 | c_1
3 | c_2
3 | c_3
预期输出示例
返回此输出的查询看起来如何
id | names
----------
1 | a_1, a_2, a_3
2 | b_1, b_2, b_3
3 | c_1, c_2, c_3
通过将第二列的SQL更改为数组,应该可以得到所需的结果
SELECT
row.id, ARRAY (SELECT item ->> 'name'
FROM
test as row1,
json_array_elements(row.data #> '{items}' ) as item WHERE row.id=row1.id)
FROM
test as row;
你最初的尝试是一步一步地漏掉一组 这应该起作用:
SELECT
id
, STRING_AGG(item->>'name', ', ')
FROM
test,
json_array_elements(test.data->'items') as item
GROUP BY 1
请注意,除非您需要捕获JSON的确切细节,如键顺序及其间隔方式,否则最好使用JSONB类型。JSON存储JSON的精确文本副本,JSONB将其存储为更高效的二进制格式。感谢您的提示,真正的数据是jsonb,示例是json以保持简单。据我所知,json和jsonb列类型的行为是相同的。提示:
string\u agg
我确实相信string\u agg是问题解决方案的一部分,但我完全不知道如何做。非常感谢,就是这样!感谢您的回复,不幸的是,我需要第二列是一个字符串,而不是数组。