如何在PostgreSQL中基于现有属性添加对象类型的JSON新键
解决AWS RDS PostgreSQL中jsonb_set类型不匹配报错问题
错误原因
你遇到的ERROR: function jsonb_set(jsonb, unknown, json) does not exist报错,核心原因是**jsonb_set函数的第三个参数要求是jsonb类型**,但你在查询中将拼接后的字符串转换为了json类型,参数类型不匹配导致函数无法识别。
正确解决方案
方案1:使用jsonb_build_object(推荐)
避免字符串拼接的潜在问题,直接用PostgreSQL提供的jsonb_build_object函数构造目标jsonb对象,更安全易维护:
UPDATE public.reviews SET data = jsonb_set( data, '{ratings}', jsonb_build_object( 'quality', (data->>'rating')::double precision, 'professionalism', (data->>'rating')::double precision, 'flexibility', (data->>'rating')::double precision, 'responseTime', (data->>'rating')::double precision, 'value', (data->>'rating')::double precision ) ) WHERE data->>'id' = '87b05c62-4153-4341-9b58-e86bade25ffd';
方案2:修正类型转换(兼容原拼接思路)
如果坚持用字符串拼接的方式,只需将类型转换从::json改为::jsonb,匹配jsonb_set的参数要求:
UPDATE public.reviews SET data = jsonb_set( data, '{ratings}', ('{ "quality": ' || (data->>'rating')::double precision || ', "professionalism": ' || (data->>'rating')::double precision || ', "flexibility": ' || (data->>'rating')::double precision || ', "responseTime": ' || (data->>'rating')::double precision || ', "value": ' || (data->>'rating')::double precision || ' }')::jsonb ) WHERE data->>'id' = '87b05c62-4153-4341-9b58-e86bade25ffd';
说明
jsonb_build_object是PostgreSQL专门用于构造jsonb对象的函数,能自动处理类型转换,避免手动拼接字符串可能出现的语法错误(比如特殊字符转义问题)。- 两种方案都先将
data->>'rating'提取的字符串转换为double precision类型,保证数值类型正确。
内容的提问来源于stack exchange,提问作者JourneyToJsDude
相关产品推荐
相关产品推荐

