You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JSON替换后大括号缺失问题及dashboard_data表UPDATE语句咨询

解决PostgreSQL中JSON键名替换导致的结构错乱问题

问题根源

你遇到的大括号缺失问题,本质是因为用纯字符串替换replace())来处理JSON结构化数据——replace()完全不理解JSON的语法规则,它只会盲目匹配并替换子串。如果你的JSON内容存在空格、换行,或者有其他地方意外包含urgent_problem_id子串,就可能破坏JSON的结构(比如错位的大括号、引号不匹配等)。更关键的是,直接操作JSON字符串是不安全的,会埋下格式错误的隐患。

正确解决方案:用PostgreSQL原生JSON函数修改键名

PostgreSQL提供了专门的JSON/JSONB处理函数,能保证修改后JSON结构的完整性。根据你的mr_data字段类型,分两种情况处理:

情况1:字段类型是jsonb(推荐存储JSON的类型)

使用jsonb_delete删除旧键,再用jsonb_set添加新键并赋值:

UPDATE dashboard_data
SET mr_data = jsonb_set(
    mr_data - 'urgent_problem_id', -- 删除旧键
    '{urgent_problem_ids}',        -- 新键的路径
    mr_data -> 'urgent_problem_id' -- 复用旧键的值
)
WHERE mr_data ? 'urgent_problem_id'; -- 仅更新存在该键的行

情况2:字段类型是json

先转成jsonb处理,完成后再转回json

UPDATE dashboard_data
SET mr_data = (
    jsonb_set(
        mr_data::jsonb - 'urgent_problem_id',
        '{urgent_problem_ids}',
        mr_data::jsonb -> 'urgent_problem_id'
    )
)::json
WHERE mr_data::jsonb ? 'urgent_problem_id';

预期结果

执行上述语句后,你的数据会得到如下正确修改:

  • 第一行:{"priority_id": "123", "urgent_problem_ids": "111", "important_problem_id": "222"}
  • 第二行:由于urgent_problem_id的值是空字符串(而非NULL),不满足原WHERE条件,保持原内容不变:{"priority_id": "456", "urgent_problem_id": "", "important_problem_id": "333"}
  • 第三行:{"priority_id": "789", "urgent_problem_ids": "444", "important_problem_id": ""}

额外提示

如果你的mr_data存储的是多个JSON对象拼接的字符串(而非单个合法JSON对象/数组),建议先将其转换为合法的JSON数组,再进行修改,否则任何字符串操作都容易破坏结构。

内容的提问来源于stack exchange,提问作者Pranav Unde

火山引擎 最新活动