替换json数据后缺少卷曲括号

时间:2018-05-04 00:23:42

标签: postgresql

跟踪表dashboard_data中的数据。列名是mr_data。

{"priority_id": "123", "urgent_problem_id": "111", "important_problem_id": "222"}
{"priority_id": "456", "urgent_problem_id": "", "important_problem_id": "333"}
{"priority_id": "789", "urgent_problem_id": "444", "important_problem_id": ""}

查询 -

UPDATE
    dashboard_data
SET
    mr_data = replace(dashboard_data.mr_data,'urgent_problem_id','urgent_problem_ids')
WHERE
    mr_data->>'urgent_problem_id' IS NOT NULL;

预期结果:

{"priority_id": "123", "urgent_problem_ids": {"111"}, "important_problem_ids": {"222"}}
{"priority_id": "456", "urgent_problem_ids": {""}, "important_problem_ids": {"333"}}
{"priority_id": "789", "urgent_problem_ids": {"444"}, "important_problem_ids": {""}}

有没有办法在替换期间获得{}的数据表示,如预期结果所示。

1 个答案:

答案 0 :(得分:1)

假设Postgres 9.5或更新。

您可以使用jsonb_set添加带有新密钥的正确JSON数组,然后从JSON中删除旧密钥(这是重命名密钥的唯一方法)

update dashboard_data
  set mr_data = jsonb_set(mr_data, '{urgent_problem_ids}', 
                          jsonb_build_array(mr_data -> 'urgent_problem_id'), true) 
                - 'urgent_problem_id'
where mr_data ? 'urgent_problem_id';

jsonb_build_array(mr_data -> 'urgent_problem_id')使用urgent_problem_id中的(单个)值创建一个正确的JSON数组,然后将该值存储在新密钥urgent_problem_ids下,最后存储在旧密钥urgent_problem_id下使用-运算符删除。

在线示例:http://rextester.com/POG52716

如果您的列不是JSONB(它应该是),那么您需要在jsonb_set()内投放该列并将结果转换回json