以SQL(Postgres)中JSON对象数组的形式返回

以SQL(Postgres)中JSON对象数组的形式返回,sql,arrays,json,postgresql,aggregate-functions,Sql,Arrays,Json,Postgresql,Aggregate Functions,我有下表MyTable: id │ value_two │ value_three │ value_four ────┼───────────┼─────────────┼──────────── 1 │ a │ A │ AA 2 │ a │ A2 │ AA2 3 │ b │ A3 │ AA3 4 │ a │ A4 │ AA4 5 │

我有下表
MyTable

 id │ value_two │ value_three │ value_four 
────┼───────────┼─────────────┼────────────
  1 │ a         │ A           │ AA
  2 │ a         │ A2          │ AA2
  3 │ b         │ A3          │ AA3
  4 │ a         │ A4          │ AA4
  5 │ b         │ A5          │ AA5
我想查询一个对象数组
{value\u three,value\u three}
value\u two
分组<代码>值\u two应单独出现在结果中。结果应该如下所示:

 value_two │                                                                                    value_four                                                                                 
───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 a         │ [{"value_three":"A","value_four":"AA"}, {"value_three":"A2","value_four":"AA2"}, {"value_three":"A4","value_four":"AA4"}]
 b         │ [{"value_three":"A3","value_four":"AA3"}, {"value_three":"A5","value_four":"AA5"}]
它使用的是
json\u agg()
还是
array\u agg()
,这并不重要

然而,我能做的最好的事情是:

with MyCTE as ( select value_two, value_three, value_four from MyTable ) 
select value_two, json_agg(row_to_json(MyCTE)) value_four 
from MyCTE 
group by value_two;
返回:

 value_two │                                                                                    value_four                                                                                 
───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
 a         │ [{"value_two":"a","value_three":"A","value_four":"AA"}, {"value_two":"a","value_three":"A2","value_four":"AA2"}, {"value_two":"a","value_three":"A4","value_four":"AA4"}]
 b         │ [{"value_two":"b","value_three":"A3","value_four":"AA3"}, {"value_two":"b","value_three":"A5","value_four":"AA5"}]
在对象中添加一个额外的
值\u two
键,我想去掉它。我应该使用哪个SQL(Postgres)查询?

在Postgres 9.4或更新版本中 或者返回
jsonb

SELECT value_two, json_agg(json_build_object('value_three', value_three
                                           , 'value_four' , value_four)) AS value_four
FROM   mytable 
GROUP  BY value_two;
但您会丢失原始列名。对已注册行类型的强制转换可以避免这种情况。(临时表的行类型也用于临时查询。)

克雷格的相关回答中有更多解释:

dbfiddle

旧的

谢谢,但这会返回带有自动生成键的对象:
{“f1”:“a”,“f2”:“AA”}
。如何将
f1
重命名为
value\u three
?@ehmicky:好的,如果您也需要列名,则需要将行强制转换为已知的复合类型。我会再添加一些。一个子选择,甚至OP的cte可能是一种更方便的方法来别名行的列名。作为一个风格注释,我认为对于新手来说,如果我们把更新放在答案的顶部,把原始注释放在下面,并注明它们适用的版本,会更容易。只要你坚持这个答案,它就永远是好的,而且随着时间的推移,对较老的PostgreSQL的建议就变得不那么有用了。@Evan:我同意。我懒得更新我所有的旧答案。但既然这一个无论如何都需要更新。。。
CREATE TYPE foo AS (value_three text, value_four text);  -- once in the same session
SELECT value_two
     , json_agg(row_to_json((value_three, value_four)::foo)) AS value_four
FROM   mytable
GROUP  BY value_two;
SELECT value_two
     , json_agg(row_to_json((SELECT t FROM (SELECT value_three, value_four) t))) AS value_four
FROM   mytable
GROUP  BY value_two;