PostgreSQL JSON字段数值运算报错:invalid input syntax for integer
解决PostgreSQL中JSON数值提取并加1的语法错误
嘿,我来帮你搞定这个问题~你遇到的错误核心是类型转换的顺序搞错了,还有不必要的嵌套查询语法,咱们一步步理清楚:
错误原因分析
你原来的代码里,::integer被错误地加在了JSON路径'{total_votes}'后面,这相当于试图把字符串"{total_votes}"转换成整数——这显然不是合法的整数格式,PostgreSQL自然会报“invalid input syntax for integer”的错误。另外,嵌套的select完全没必要,反而把语法搞复杂了。
正确的写法
我们需要先从JSON对象里提取出total_votes的数值,转换成整数后再加1,这里有两种常用的方式:
方式一:用#>>直接提取文本再转整数
#>>操作符会直接把JSON字段的值提取成文本类型,之后转成整数就很顺畅:
declare total_votes integer; poll_result json; -- 假设你已经正确获取了这个变量的值 begin select result into poll_result from polls where id = 1; total_votes = (poll_result #>> '{total_votes}')::integer + 1; end;
方式二:用#>提取JSON值再转类型
如果你习惯用#>(返回JSON类型的数值),需要先把JSON值转成数值类型,再转整数:
declare total_votes integer; poll_result json; begin select result into poll_result from polls where id = 1; total_votes = (poll_result #> '{total_votes}')::numeric::integer + 1; end;
额外小提示
如果你的PostgreSQL版本是12及以上,还可以用更直观的JSON路径表达式来提取值:
total_votes = jsonb_path_query_first(poll_result::jsonb, '$.total_votes')::integer + 1;
这种写法可读性更强,适合复杂的JSON结构。
内容的提问来源于stack exchange,提问作者Code Guru
相关产品推荐
相关产品推荐

