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"被当作键名新增)。
- 如果当前层级是数组:会被转换成整数,当作数组的索引(数组索引从0开始)。索引超出数组长度时,
三、复杂JSON场景的工作方式
结合你提供的示例来拆解逻辑:
原始JSON对象:
obj = '{"Id": 1, "Values": {"Name": "Doe", "Online": [10,20,30]}}'
示例1:jsonb_set(obj, '{Values,0}', '99')
- 第一个path元素
"Values":定位到外层的Values对象; - 第二个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')
- 第一个path元素
"Values":定位到外层的Values对象; - 第二个path元素
"Online":定位到Values对象中的Online数组; - 第三个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
相关产品推荐
相关产品推荐

