2017-04-20 67 views
0

我可以按照我想要的方式使用jsonb_build_object来创建JSON对象。例如。jsonb_agg:避免使用“jsonb_build_object”包装对象

SELECT jsonb_build_object('id', id) FROM (SELECT generate_series(1,3) id) objects; 

结果

jsonb_build_object 
------------------ 
{"id": 1} 
{"id": 2} 
{"id": 3} 

但是,当我想将它们添加到一个数组,它们被包裹在一个额外的对象,使用列名作为关键字:

SELECT jsonb_build_object(
    'foo', 'bar', 
    'collection', jsonb_agg(collection) 
) 
FROM (
    SELECT jsonb_build_object('id', id) 
    FROM (
    SELECT generate_series(1,3) id 
) objects 
) collection; 

结果in

{"foo": "bar", "collection": [{"jsonb_build_object": {"id": 1}}, {"jsonb_build_object": {"id": 2}}, {"jsonb_build_object": {"id": 3}}]} 

How我可以得到

{"foo": "bar", "collection": [{"id": 1}, {"id": 2}, {"id": 3}]} 

改为?

+0

这是http://stackoverflow.com/q/30521196的副本,对不起! – hfs

回答

1

使用jsonb_agg(collection.jsonb_build_object)。您也可以使用别名,但问题是collection引用整行,其中有一个(单个)jsonb_build_object命名(默认)列,即您要聚合的JSON。

随着简化和别名,查询可以是:

SELECT  jsonb_build_object(
      'foo', 'bar', 
      'collection', jsonb_agg(js) 
      ) 
FROM  generate_series(1,3) id 
CROSS JOIN LATERAL jsonb_build_object('id', id) js; 

  • LATERAL是隐含的,我只是写它的清晰度
  • 走样这样的FROM子句创建一个表&也是一个列别名,具有相同的名称。所以它相当于jsonb_build_object('id', id) AS js(js)