2017-04-20 4 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}}]} 

私は得ることができる

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

代わりにか。

+0

これは、http://stackoverflow.com/q/30521196の複製です。申し訳ありません。 – hfs

答えて

1

jsonb_agg(collection.jsonb_build_object)を使用してください。エイリアスも使用できますが、ポイントはcollectionが行全体を参照しており、集計するJSON(デフォルト)列の(単一の)jsonb_build_objectという列があります。

簡素化され、別名を使用すると、クエリが使用できます

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)