postgresql 如何隐藏聚合JSON数组元素的键

68de4m5k  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(2)|浏览(158)

在使用jsonb和Postgres时,我遇到了以下问题:
我的输出看起来像这样:[ {columnName: {}}, { columnName: {} } ]但我希望它看起来像这样:[ {}, {} ]
我想把所有的对象放在一个jsonb数组中,但不添加列名。
下面是基本查询,可以在下面的fiddle中看到:http://sqlfiddle.com/#!17/b701 b8/2
我注意到当使用array_agg()时,列名没有被添加,但是使用JSON时,它们会被添加。如何删除列名,以便我可以使用JSON获得所需的输出?

select json_agg(v)
from (
  select json_build_object('pos',pos, 'type',type, 'color',color)
  from (select * from images)a
  union all 
  select json_build_object('pos',pos, 'type',type, 'value',value)
  from (select * from letters)b
)v

字符串

xhv8bpkk

xhv8bpkk1#

聚合而不是整行:

SELECT json_agg(v.image) AS images
FROM  (
   SELECT json_build_object('pos',pos, 'type',type, 'color',color) AS image  -- !
   FROM   images i -- simpler

   UNION ALL
   SELECT json_build_object('pos',pos, 'type',type, 'value',value)
   FROM   letters l  -- simpler
   ) v;

字符串
值得注意的是,您的查询生成json,而不是jsonb
嵌套整行时更简单:

SELECT json_agg(v.image) AS images
FROM  (   
   SELECT to_json(i) AS image
   FROM   images i

   UNION ALL
   SELECT to_json(l)
   FROM   letters l
   ) v;


类似于**jsonb**(其中白空间不是问题)

SELECT jsonb_agg(v.image) AS images
FROM  (   
   SELECT to_jsonb(i) AS image
   FROM   images i

   UNION ALL
   SELECT to_jsonb(l)
   FROM   letters l
   ) v;


fiddle
参见:

sqougxex

sqougxex2#

如果这两个表的列类型确实匹配,则可以通过标记行并在聚合位置构建jsonb来缩短查询:demo at db<>fiddle

select jsonb_agg(jsonb_build_object('pos',pos,'type',type,label,color_or_value))
from (select pos, type,'color' as "label",color as "color_or_value" from images
      union all 
      select pos, type,'value' as "label",value from letters )v;

字符串
| jsonb_agg|
| --|
| [{“pos”:0,“type”:“image”,“color”:“red”},{“pos”:1,“type”:“image”,“color”:“blue”},{“pos”:2,“type”:“text”,“value”:“book”}]|

相关问题