Arrays 连接postgresql json数组中对象的字符串值

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" },

我有一个带有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" },
        { "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是问题解决方案的一部分,但我完全不知道如何做。非常感谢,就是这样!感谢您的回复,不幸的是,我需要第二列是一个字符串,而不是数组。