You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL文本列JSON属性更新出错:值被设为Null的问题排查

问题原因分析

你的代码核心错误是没有正确将文本列的JSON字符串解析为JSON对象,反而把整个字符串当成了JSON的字符串字面量处理,导致无法正确读取目标属性值,最终计算得到Null并赋值。

具体来说:

  • to_json(comments) 和 to_jsonb(comments) 接收文本类型输入时,会把输入的文本转成JSON的字符串值(比如把{"test1":100}变成"{"test1":100}"这样的JSON字符串),而不是解析这个文本为JSON对象。
  • 后续用->> commentKey从这个JSON字符串中取属性,自然取不到有效值,得到Null,计算后还是Null,最终jsonb_set把属性设为Null。
修正后的代码
do $$
declare
  commentKey text;
  commentKeys text[] := array['test1','test2'];
begin
   FOREACH commentKey IN ARRAY commentKeys
  loop
     UPDATE a
     SET comments = jsonb_set(comments::jsonb, ('{'||commentKey||'}')::text[], to_jsonb(round(((comments::jsonb ->> commentKey)::numeric) / 100, 6)))::text
     WHERE comments::jsonb ->> commentKey is not null;
  end loop;
end;
$$ language plpgsql;
关键修改点
  • 将所有to_json(comments)和to_jsonb(comments)替换为comments::jsonb:直接把文本列的内容解析为JSONB对象,而不是当成普通字符串处理。
  • 在jsonb_set结果后添加::text:显式将JSONB类型转换为文本类型,匹配comments列的类型(虽然PostgreSQL支持隐式转换,但显式转换更清晰可靠)。
验证说明

执行修正后的代码后,原数据{"test1":100,"test2":200}会被更新为{"test1": 1.000000, "test2": 2.000000},符合预期。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:17:23