PostgreSQL jsonb_insert() 函数使用指南

PostgreSQL jsonb_insert() 函数将一个新值插入到一个给定的 JSONB 值中通过路径指定的位置。

jsonb_insert() 语法

这是 PostgreSQL jsonb_insert() 函数的语法:

jsonb_insert(
  target JSONB, path TEXT[], new_value JSONB[, insert_after BOOLEAN]
) -> JSONB

参数

target
必需的。 要插入新值的 JSONB 值。
path
必需的。 一个文本数组,指示了新值插入的位置。数组中靠前的路径,应该包含数组中靠后的路径。
new_value
必需的。 要插入的新值。
insert_after
可选的。 它指示是否插入到指定的位置之后。默认是值 false

返回值

PostgreSQL jsonb_insert() 函数返回给定的 JSONB 值,其中在指定的路径上插入了指定的新值。

如果路径指向一个对象字段,只有当对象中不存在此字段时新值才会被插入。

如果路径指向的是一个数组元素,若 insert_after 为 false(默认值), 则新值默认插入到指定的元素之前,否则新值插入到指定的元素之后。

如果 JSONB 值中未找到指定的路径,则 JSON 值不会被修改,并原样返回。

jsonb_insert() 示例

下面的示例展示了如何使用 PostgreSQL jsonb_insert() 函数向一个 JSON 对象中插入一个键。

SELECT jsonb_insert('{"x": 1}', '{y}', '2');
   jsonb_insert
------------------
 {"x": 1, "y": 2}

下面的示例展示了如何使用 PostgreSQL jsonb_insert() 函数向一个 JSON 数组中插入一个新元素。

SELECT jsonb_insert('{"x": 1, "y": [1, 2]}', '{y, 0}', '0');
       jsonb_insert
--------------------------
 {"x": 1, "y": [0, 1, 2]}

这里, 数组 {y, 0} 表示先找到对象中的 y 字段,再找到 y 字段中的索引为 0 的位置,然后在此位置插入新元素 0。

当然,我们可以将新元素插入到指定的位置之后:

SELECT jsonb_insert('{"x": 1, "y": [1, 2]}', '{y, 0}', '0', true);
       jsonb_insert
--------------------------
 {"x": 1, "y": [1, 0, 2]}

您不能替换一个对象中已经存在的键,比如:

SELECT jsonb_insert('{"x": 1}', '{x}', '2');

这将会引发一个错误:

错误: 不能替换已经存在的键 提示: 尝试使用 jsonb_set 来替换键值。