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
相关产品推荐
相关产品推荐

