PostgreSQL使用array_agg和jsonb_build_object

时间:2018-08-24 17:40:16

标签: postgresql jsonb array-agg

我正在从各种表中构建一个JSON对象。我已经成功获得以下代码,几乎可以完成我想做的事情。唯一的问题是将聚合数组设置为另一个对象,我只希望主对象中的项目数据指向所选行的数组。

SELECT jsonb_build_object('ok',false,'data',f1) FROM 
    (SELECT array_agg(f2) FROM (
    SELECT c.catalogid,cl.title,cl.shortname FROM
    shopmaster.catalog c LEFT JOIN
    shopmaster.catalog_lang cl ON c.catalogid=cl.catalogid LEFT JOIN
    shopmaster.lang l ON cl.langid=l.langid
    WHERE inherit_from=3 AND code='en') f2) f1;

这将返回以下json

{"ok": false, "data": {"array_agg": [{"title": "Vitamins", "catalogid": 6, "shortname": "vit"}, {"title": "Cheese Vitamins", "catalogid": 7, "shortname": "chevit"}, {"title": "fruitveg", "catalogid": 8, "shortname": "fruit and veg"}, {"title": "Magazines", (...)

我想要的时候

{"ok": false, "data": [{"title": "Vitamins", "catalogid": 6, "shortname": "vit"}, {"title": "Cheese Vitamins", "catalogid": 7, "shortname": "chevit"}, {"title": "fruitveg", "catalogid": 8, "shortname": "fruit and veg"}, {"title": "Magazines", (...)

1 个答案:

答案 0 :(得分:0)

根据先前的回答,我可以选择命名结果,例如f1.array_agg。最后,我像这样使用jsonb_agg()函数

SELECT jsonb_build_object('ok',false,'data',jsonb_agg(f1)) FROM (
    SELECT c.catalogid,cl.title,cl.shortname FROM
    shopmaster.catalog c LEFT JOIN
    shopmaster.catalog_lang cl ON c.catalogid=cl.catalogid LEFT JOIN
    shopmaster.lang l ON cl.langid=l.langid
    WHERE inherit_from=3 AND code='en') f1