以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;
但您会丢失原始列名。对已注册行类型的强制转换可以避免这种情况。(临时表的行类型也用于临时查询。)
克雷格的相关回答中有更多解释:
旧的谢谢,但这会返回带有自动生成键的对象:
{“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;