You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL14 PL/pgSQL下更新带嵌套数组的jsonb对象数组指定元素

解决方案

针对内存中jsonb数组的指定元素更新需求,不需要使用复杂的路径查询或动态SQL,直接通过数组展开、条件修改、重新聚合的逻辑即可实现,同时可以规避原有动态拼接字符串导致的转义错误、注入风险问题。

完整实现代码

DO $$
DECLARE
    -- 你的原始jsonb变量
    res jsonb := '[ {"county": "x", "dpa": ["a", "b", "c"]}, {"county": "y", "dpa": ["d", "e", "f"]}, {"county": "z", "dpa": ["h", "i", "j"]}]'::jsonb;
    -- 对应你循环中的变量
    cty record;
    r1 record;
BEGIN
    -- 此处替换为你原有的循环查询逻辑
    FOR cty IN SELECT 'y' AS cty_name LOOP
        FOR r1 IN SELECT 'm' AS name LOOP
            -- 核心更新逻辑:替代你原有步骤1-3的所有代码
            SELECT jsonb_agg(
                CASE
                    -- 匹配county值的元素做dpa字段更新
                    WHEN elem->>'county' = cty.cty_name
                    THEN elem || jsonb_build_object('dpa', (elem->'dpa') || jsonb_build_array(r1.name))
                    -- 不匹配的元素原样保留
                    ELSE elem
                END
            ) INTO res
            FROM jsonb_array_elements(res) AS elem;
        END LOOP;
    END LOOP;

    -- 步骤4:新建表存储最终jsonb
    CREATE TABLE IF NOT EXISTS county_dpa_result (
        result_data jsonb NOT NULL
    );
    INSERT INTO county_dpa_result VALUES (res);
END $$;

说明

  • 该方案对数百个元素的jsonb数组处理性能足够,不需要依赖任何表存储的jsonb数据
  • 完全规避了原有动态SQL拼接jsonb字符串可能产生的单引号转义错误、SQL注入风险
  • 执行后你可以直接查询county_dpa_result表验证更新后的结果

内容的提问来源于stack exchange,提问作者Morik-san

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 07:15:06