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

时间:2017-11-11 23:15:02

标签: arrays json postgresql

我有一个postgresql表,其中json列填充了嵌套在数组中的对象。现在我想构建一个返回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 Fiddle link

2 个答案:

答案 0 :(得分:1)

您的原始尝试错过了一步一步

这应该有效:

SELECT
    id
  , STRING_AGG(item->>'name', ', ')
FROM
  test,
  json_array_elements(test.data->'items') as item
GROUP BY 1

答案 1 :(得分:0)

通过将第二列的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;