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

PostgreSQL中路径键为变量时如何更新JSONB值?

解决PostgreSQL中jsonb_set函数报错的问题

你遇到的报错核心原因是参数类型不匹配:jsonb_set函数的第二个参数(用于指定JSONB对象的路径)要求是text[](文本数组)类型,但你通过字符串拼接('{'||vote_to||'}')生成的是一个普通的text字符串(比如'{yes}'),PostgreSQL找不到对应参数签名的jsonb_set函数,因此抛出错误。

正确的解决方法

直接将vote_to包装成文本数组即可,不需要做字符串拼接。这里有两种简洁的写法:

方法1:使用ARRAY构造器(推荐)

这是最直观的方式,单个键的路径直接用ARRAY[vote_to]表示:

UPDATE polls
SET result = jsonb_set(result, ARRAY[vote_to], vote_count::jsonb)
WHERE id = _poll_id;

方法2:如果vote_to是拼接的路径字符串(比如嵌套路径)

如果后续需要处理嵌套键(比如'yes.count'这种格式的路径),可以用string_to_array将字符串转成数组:

-- 假设vote_to是'yes.count',拆分后成为['yes', 'count']
UPDATE polls
SET result = jsonb_set(result, string_to_array(vote_to, '.'), vote_count::jsonb)
WHERE id = _poll_id;

额外优化点

你原来的写法里vote_count::text::jsonb可以简化成vote_count::jsonb——PostgreSQL支持直接将数字类型转换为JSONB类型,不需要先转成文本。

完整示例

假设你的变量值如下,执行这段代码就能正确更新指定键的值:

DECLARE
  vote_to text := 'yes';
  vote_count integer := 6;
  _poll_id integer := 1;
BEGIN
  UPDATE polls
  SET result = jsonb_set(result, ARRAY[vote_to], vote_count::jsonb)
  WHERE id = _poll_id;
END;

执行后,你的result字段会从{"yes":5,"total_votes":6,"no":1}更新为{"yes":6,"total_votes":6,"no":1}。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:20:56