如何在Postgres中将查询结果转换为JSON对象

17

我有一个简单的查询,SELECT name, grp FROM things; 它会返回以下表格:

 name | grp 
------+-----
 a    | y
 b    | x
 c    | x
 d    | z
 e    | z
 f    | z

我希望最终得到以下的单个JSON对象:

 {y: [a], x: [b,c], z: [d,e,f]}

我觉得使用查询语句SELECT grp, array_agg(name) as names FROM things GROUP BY grp;可以将"name"压缩成一个数组而且能够得到三行结果,但是我不知道该如何将行压缩成单个JSON对象。

可能更接近的语句是SELECT json_build_object(grp, array_agg(name)) as objects FROM things GROUP BY grp;,它会返回独立的JSON对象 {y: [a]}。但它们仍然是独立对象,所以可能不是正确的路径。

这是在Postgresql 9.4使用的。

1个回答

19

看起来关键在于json_object_agg函数,该函数未与其他json函数一起列在列表中。

参见:http://www.postgresql.org/docs/9.4/static/functions-aggregate.html

以下查询将得到我想要的结果:

SELECT json_object_agg(each.grp, each.names) FROM (
    SELECT grp, array_agg(name) as names FROM things GROUP BY grp
) AS each;

9
为什么我总是花一天半的时间试图自己找出答案,然后放弃,发帖到 Stack Overflow 上,再搜索一下,就在十分钟内找到了答案。 - azdle
7
这里积累的丰富知识会滋养您的思想。 - klin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接