我有一个包含两列的表格。主键和名为 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
我做错了什么?
您可以使用
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;