如何解决如何遍历PostgreSQL jsonb对象数组并修改元素?
给出jsonb数组和PostgreSQL 12:
[{"data":"42","type":"TEMPERATURE"},{"data":"1.1","type":"PRESSURE"}]
需要将其转换为:
[{"data":"42","type":"temperature"},"type":"pressure"}]
是否有可能以某种方式遍历jsonb数组并仅将“类型”值转换为小写?
我尝试过:
SELECT jsonb_agg(
jsonb_build_object(k,CASE WHEN k <> 'type' THEN v ELSE lower(v::text)::jsonb END)
)
FROM jsonb_array_elements(
'[{"data":"42","type":"PRESSURE"}]'::jsonb
) e(e),lateral jsonb_each(e) p(k,v)
但是它将数据和类型对分离为单独的元素。
[{"data": "42"},{"type": "temperature"},{"data": "1.1"},{"type": "pressure"}]
解决方法
在将对象聚合到数组中之前,您需要中间级别的嵌套来重建对象:为此,您可以使用横向联接。
我还建议跟踪每个对象在原始数组中的位置,以便您可以将其传播到最终结果-with ordinality
很方便。
SELECT jsonb_agg(x.obj order by e.n)
FROM jsonb_array_elements('[{"data":"42","type":"TEMPERATURE"},{"data":"1.1","type":"PRESSURE"}]'::jsonb) with ordinality e(e,n)
CROSS JOIN LATERAL (
SELECT jsonb_object_agg(k,CASE WHEN k <> 'type' THEN v ELSE lower(v::text)::jsonb END)
FROM jsonb_each(e) p(k,v)
) x(obj)
| jsonb_agg | | :--------------------------------------------------------------------------- | | [{"data": "42","type": "temperature"},{"data": "1.1","type": "pressure"}] |
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。