跟踪表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": {""}}
有没有办法在替换期间获得{}的数据表示,如预期结果所示。
答案 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