【问题标题】:How to iterate over PostgreSQL jsonb array of objects and modify elements?如何遍历 PostgreSQL jsonb 对象数组并修改元素?
【发布时间】:2021-01-14 23:29:28
【问题描述】:

给定 jsonb 数组和 PostgreSQL 12:

[{"data":"42","type":"TEMPERATURE"},{"data":"1.1","type":"PRESSURE"}]

需要转换成:

[{"data":"42","type":"temperature"},{"data":"1.1","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":"TEMPERATURE"},{"data":"1.1","type":"PRESSURE"}]'::jsonb
) e(e), lateral jsonb_each(e) p(k, v)

但它将数据和类型对分成单独的元素。

[{"data": "42"}, {"type": "temperature"}, {"data": "1.1"}, {"type": "pressure"}]

【问题讨论】:

    标签: sql arrays json postgresql unnest


    【解决方案1】:

    在将对象聚合到数组中之前,您需要一个中间级别的嵌套来重建对象:为此,您可以使用横向连接。

    我还建议跟踪原始数组中每个对象的位置,以便将其传播到最终结果 - 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)
    

    Demo on DB Fiddle

    | jsonb_agg | | :------------------------------------------------ -------------------------- | | [{“数据”:“42”,“类型”:“温度”},{“数据”:“1.1”,“类型”:“压力”}] |

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多