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

PostgreSQL jsonb字段跨列嵌套复制语法错误求助

解决PostgreSQL中JSONB字段嵌套更新的语法错误

问题场景

有一个名为entity的表,包含两个jsonb类型字段:options和features。需要将options字段内的test字段值,复制到features字段中两层嵌套的informations.test位置。

错误的SQL语句及报错

尝试执行的SQL:

UPDATE entity 
SET features = jsonb_set(  features
                         , '{informations}'
                         , "features"->'informations' 
                         ||'{"test": "options"->'test'}'
                         , true);

运行时报错:

QueryFailedError: syntax error at or near "test"

错误原因

  1. 单引号嵌套冲突:'{"test": "options"->'test'}'中,内部的'test'会提前闭合外层单引号,直接导致语法解析错误。
  2. 类型处理错误:直接拼接字符串无法正确处理jsonb类型,options->'test'是JSONB对象,拼接成字符串后会丢失类型信息,无法正确合并到目标JSONB结构中。

正确的实现方式

方式一:直接通过嵌套路径更新

利用jsonb_set的多段路径直接定位到目标字段,这是最简洁的写法:

UPDATE entity 
SET features = jsonb_set(
    features,
    '{informations, test}',
    options->'test',
    true
);
  • 路径'{informations, test}'直接指向features里informations下的test节点
  • 第三个参数options->'test'直接传入要复制的JSONB值
  • 最后一个true表示如果目标路径不存在(比如informations字段不存在),则自动创建路径

方式二:合并原对象后更新

如果需要保留informations原有的其他字段,也可以先合并原对象与新的test键值对,再写回:

UPDATE entity 
SET features = jsonb_set(
    features,
    '{informations}',
    (features->'informations') || jsonb_build_object('test', options->'test'),
    true
);
  • 使用jsonb_build_object构造包含test键的JSONB对象,避免字符串拼接的语法问题
  • 通过||运算符合并原informations对象和新的键值对
  • 再用jsonb_set写回features的informations字段

补充说明

反向迁移的SQL语句可以正常执行,因为不存在单引号嵌套问题:

UPDATE entity 
SET options = jsonb_set(  options
                        , '{test}'
                        , features->'informations'->'test'
                        , true);

内容的提问来源于stack exchange,提问作者FE-P

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 16:55:29