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

PostgreSQL jsonb_set函数path参数的有效值与解析规则咨询

PostgreSQL jsonb_set 函数 path 参数详解

一、path 参数的有效值类型

path 是 text[] 类型的数组,每个元素只能是两种形式:

  • 对象键名:任意合法的JSON字符串(比如"Name"、"Values")
  • 数组索引的字符串形式:纯数字组成的字符串(比如"0"、"3")

二、不同类型元素的解析逻辑

PostgreSQL会根据当前JSON层级的类型(对象/数组),自动解析path元素:

  • 非数字格式的字符串:一律当作JSON对象的键名,匹配对应层级对象中的键。如果对象里没有这个键,在create_missing参数为true(默认值)时会自动新增该键。
  • 纯数字格式的字符串:
    • 如果当前层级是数组:会被转换成整数,当作数组的索引(数组索引从0开始)。索引超出数组长度时,create_missing=true会把元素追加到数组末尾。
    • 如果当前层级是对象:不会被当作数组索引,而是直接作为对象的键名处理(比如示例中的{Values,0},Values是对象,所以"0"被当作键名新增)。

三、复杂JSON场景的工作方式

结合你提供的示例来拆解逻辑:
原始JSON对象:

obj = '{"Id": 1, "Values": {"Name": "Doe", "Online": [10,20,30]}}'

示例1:jsonb_set(obj, '{Values,0}', '99')

  1. 第一个path元素"Values":定位到外层的Values对象;
  2. 第二个path元素"0":当前层级是对象,所以"0"被当作对象键名,直接在Values对象中新增键值对"0": 99,最终结果:
{"Id": 1, "Values": {"0": 99, "Name": "Doe", "Online": [10, 20, 30]}}

示例2:jsonb_set(obj, '{Values,Online,0}', '99')

  1. 第一个path元素"Values":定位到外层的Values对象;
  2. 第二个path元素"Online":定位到Values对象中的Online数组;
  3. 第三个path元素"0":当前层级是数组,所以被解析成索引0,将该位置的元素替换为99,最终结果:
{"Id": 1, "Values": {"Name": "Doe", "Online": [99, 20, 30]}}

额外补充:自动创建层级的情况

如果path中某一层级不存在,create_missing=true时会自动创建对应结构:
比如执行jsonb_set(obj, '{NewField,Arr,2}', '100'),会自动创建NewField对象,里面新增Arr数组,索引2的位置设为100,结果为:

{"Id": 1, "Values": {"Name": "Doe", "Online": [10,20,30]}, "NewField": {"Arr": [null, null, 100]}}

内容的提问来源于stack exchange,提问作者FireEmerald

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 02:52:35