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"
错误原因
- 单引号嵌套冲突:
'{"test": "options"->'test'}'中,内部的'test'会提前闭合外层单引号,直接导致语法解析错误。 - 类型处理错误:直接拼接字符串无法正确处理
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
相关产品推荐
相关产品推荐

