更新包含 JSON 对象的文本列中的 JSON 属性

问题描述 投票:0回答:1

我有一个包含两列的表格。主键和名为 comments 的列,该列是文本列,但包含 json 对象。现在,我想通过将该值除以 100 来更新该属性具有值的所有列中的所有属性。但是,这不起作用,因为它只是将这些属性设置为 null:

do $$
declare
  commentKey text;
  commentKeys text[] := array['test1','test2'];
begin
   FOREACH commentKey IN ARRAY commentKeys
  loop
     UPDATE a
     SET comments = jsonb_set(to_jsonb(comments), ('{'||commentKey||'}')::text[], to_jsonb(round(((to_json(comments) ->> commentKey)::numeric) / 100, 6)))
     WHERE comments::jsonb ->> commentKey is not null;
  end loop;
end;
$$ language plpgsql;

这是一个数据库小提琴:https://dbfiddle.uk/uhEChx-S

我做错了什么?

sql json database postgresql jsonb
1个回答
0
投票

您可以使用

jsonb_object_agg
构建新的 JSON 对象,其中与
commentKeys
内容匹配的键的值除以
100
,如果值不是
null
:

do $$
declare
  commentKey text;
  commentKeys text[] := array['test1','test2'];
begin
   update a set comments = (select jsonb_object_agg(k.key, 
       case when k.value#>>'{}' is not null and k.key::text = any(commentKeys) 
              then (k.value::text::float / 100)::text::jsonb 
            else k.value end) 
       from jsonb_each(comments::jsonb) k);
end;
$$ language plpgsql;

看小提琴

© www.soinside.com 2019 - 2024. All rights reserved.