如何获取从json_agg查询返回的计数或记录?

问题描述

我正在动态建立一些看起来像这样的查询

select array_to_json(array_agg(t)) from (
select 
a.field_1,a.field_2,jsonb_agg(distinct jsonb_build_object('id',g.id,'data',g.fullname)) as field_4,i.optionid,i.option)) as field_9,c.id,c.fullname)) as field_6,k.id,k.fullname)) as field_8,m.id,m.field_20)) as field_21,l.field_5,e.optionid,e.option,'attributes',e.attributes)) as field_23,n.data as field_13,bb.id,bb.fullname)) as field_12

from schema_1.tbl_342 a
left join schema_1.tbl_342_to_tbl_329_field_10 b on a.id=b.tbl_342_id
left join schema_1.tbl_329_customid c on b.tbl_329_id=c.id
left join schema_1.tbl_329 m on m.id=b.tbl_329_id
left join schema_1.tbl_329_field_23_join d on c.id=d.id
left join schema_1.tbl_329_field_23 e on d.optionid = e.optionid
left join schema_1.tbl_342_to_tbl_312_field_4 f on a.id=f.tbl_342_id
left join schema_1.tbl_312_customid g on f.tbl_312_id = g.id
left join schema_1.tbl_342_field_9_join h on h.id=a.id
left join schema_1.tbl_342_field_9 i on i.optionid=h.optionid
left join schema_1.tbl_343_to_tbl_342_field_6 j on j.tbl_342_id=a.id
left join schema_1.tbl_343_customid k on j.tbl_343_id=k.id
left join schema_1.tbl_343 l on l.id=j.tbl_343_id
left join schema_1.tbl_342_field_13_max n on n.id=a.id
group by a.field_1,m.field_23,n.data
) t

输出示例如下所示

[{"field_1":"Billy","field_2":null,"field_4":[{"id": 4,"data": "Senior Javascript Engineer"},{"id": 5,"data": "Recruiter"}],"field_9":[{"id": 1,"data": "Blue"}],"field_6":[{"id": 32,"data": "Nancy - 32"}],"field_8":[{"id": null,"data": null}],"field_21":[{"id": 32,"data": "ggñ@cnn.com"}],"field_5":null,"field_23":[{"id": 5,"data": "Expert","attributes": {"text": "#FFFFFF","color": "#448AFF"}}],"field_13":"Expert"},{"field_1":"Jackson","field_4":[{"id": 2,"data": "Marketing Manager M1004"},{"id": 4,"field_9":[{"id": 3,"data": "Red"}],"field_6":[{"id": 36,"data": ",Mike - 36"}],"field_8":[{"id": 2,"data": "Henry"}],"field_21":[{"id": 36,"data": "[email protected]"}],"field_5":"CA","field_23":[{"id": 6,"data": "Guru","color": "#0D47A1"}}],"field_13":"Guru"},{"field_1":"Jacob","field_4":[{"id": null,"field_9":[{"id": null,"field_6":[{"id": null,"field_21":[{"id": null,"field_23":[{"id": null,"data": null,"attributes": null}],"field_13":null},{"field_1":"John","field_9":[{"id": 2,"data": "Green"}],"data": "Nancy - 32"},{"id": 35,"data": "Bobby - 35"}],"data": "ggñ@cnn.com"},"data": "[email protected]"}],"field_23":[{"id": 4,"data": "Experienced","color": "#C79702"}},{"field_1":"Todd","field_9":[{"id": 4,"data": "Yellow"}],"field_6":[{"id": 1,"data": "Bobbie - 1"},"data": "bobby - 4"}],"field_8":[{"id": 1,"data": "Please stand up"}],"field_21":[{"id": 1,"data": "[email protected]"},"field_5":"MA","field_23":[{"id": 2,"data": "Novice","attributes": {"text": "#000000","color": "#FFEB3B"}},{"id": 3,"data": "Intermediate","color": "#F5F5F5"}}],"field_13":"Intermediate"}]

这里是我想要得到的输出

{count: 5,data:[{"field_1":"Billy","field_13":"Intermediate"}]}

我希望将返回的总记录在顶层属性中,与数据结果分开。 我该怎么做,我尝试添加作为基础表的count(a.id),但它不返回总记录。

解决方法

使用json_array_length,因为最终输出格式为JSON Array

select jsonb_build_object('count',json_array_length(data),'data',data) from (
select array_to_json(array_agg(t)) data from (
select 
a.field_1,a.field_2,jsonb_agg(distinct jsonb_build_object('id',g.id,g.fullname)) as field_4,i.optionid,i.option)) as field_9,c.id,c.fullname)) as field_6,k.id,k.fullname)) as field_8,m.id,m.field_20)) as field_21,l.field_5,e.optionid,e.option,'attributes',e.attributes)) as field_23,n.data as field_13,bb.id,bb.fullname)) as field_12

from schema_1.tbl_342 a
left join schema_1.tbl_342_to_tbl_329_field_10 b on a.id=b.tbl_342_id
left join schema_1.tbl_329_customid c on b.tbl_329_id=c.id
left join schema_1.tbl_329 m on m.id=b.tbl_329_id
left join schema_1.tbl_329_field_23_join d on c.id=d.id
left join schema_1.tbl_329_field_23 e on d.optionid = e.optionid
left join schema_1.tbl_342_to_tbl_312_field_4 f on a.id=f.tbl_342_id
left join schema_1.tbl_312_customid g on f.tbl_312_id = g.id
left join schema_1.tbl_342_field_9_join h on h.id=a.id
left join schema_1.tbl_342_field_9 i on i.optionid=h.optionid
left join schema_1.tbl_343_to_tbl_342_field_6 j on j.tbl_342_id=a.id
left join schema_1.tbl_343_customid k on j.tbl_343_id=k.id
left join schema_1.tbl_343 l on l.id=j.tbl_343_id
left join schema_1.tbl_342_field_13_max n on n.id=a.id
group by a.field_1,m.field_23,n.data
) t)x

它将为您提供所需的输出

根据评论更新

with cte as (
select 
a.field_1,n.data
),cte2 as 
(select count(*) as "count_" from cte)

select row_to_json(x) from (
select cte2.count_ "count",array_to_json(array_agg(t)) as data from (
select * from cte limit 3 -- you can add desired limit here
 ) t,cte2
group by 1
)x