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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:15:40