PostgreSQL jsonb_extract_path_text() 函数使用指南

PostgreSQL jsonb_extract_path_text() 函数从一个指定的 JSONB 对象中根据指定的路径提取 JSONB 子对象,并将结果作为文本返回。

此函数与 json_extract_path() 函数类似,不同的是此函数返回一个文本类型的值而不是 JSONB 类型。

jsonb_extract_path_text() 语法

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

jsonb_extract_path_text(from_json JSONB, VARIADIC path TEXT[]) -> TEXT

参数

from_json
必需的。 要从中提取 JSONB 子对象的 JSONB 对象。
path
必需的。 是一个可变的参数列表。它指定了要提取的路径。前面的路径应该包含有序的路径。

返回值

PostgreSQL jsonb_extract_path_text() 函数返回一个文本,它是指定的 JSONB 对象中指定的路径上的 JSONB 值的文本表示。

当可变参数列表 path 中有个多个参数时,前面的路径应该包含后面的路径,这样才能够在 JSONB 对象中提取到值。

如果路径不存在,jsonb_extract_path_text() 函数返回 null。

jsonb_extract_path_text() 示例

JSONB 数组示例

本示例展示了如何使用 PostgreSQL jsonb_extract_path_text() 函数从一个 JSONB 数组的指定索引上提取值。

SELECT
    jsonb_extract_path_text('[1, 2, [3, 4]]', '0') AS "#[0]",
    jsonb_extract_path_text('[1, 2, [3, 4]]', '1') AS "#[1]",
    jsonb_extract_path_text('[1, 2, [3, 4]]', '2') AS "#[2]";
 #[0] | #[1] |  #[2]
------+------+--------
 1    | 2    | [3, 4]

这里,我们分别提取了索引为 0,1,和 2 上值,jsonb_extract_path_text() 函数也给出了正确的反馈。

如果我们想要提取 索引为 2 的内嵌数组中的值,该怎么做呢? 请使用下面的语句:

SELECT
    jsonb_extract_path_text('[1, 2, [3, 4]]', '2', '0') AS "#[2][0]",
    jsonb_extract_path_text('[1, 2, [3, 4]]', '2', '1') AS "#[2][1]";
 #[2][0] | #[2][1]
---------+---------
 3       | 4

这里,我们在可变参数 path 中先使用 '2',再使用 '0',这相当于如下的计算步骤:

  1. jsonb_extract_path_text('[1, 2, [3, 4]]', '2') 返回了 [3, 4]
  2. jsonb_extract_path_text('[3, 4]', '0') 返回了 3
  3. 3 转为文本并返回

JSONB 对象示例

本示例展示了如何使用 PostgreSQL jsonb_extract_path_text() 函数从一个 JSONB 对象的指定路径上提取值。

SELECT
    jsonb_extract_path_text('{"a": 1, "b": {"x": 2, "y": 3}}', 'a') AS "#.a",
    jsonb_extract_path_text('{"a": 1, "b": {"x": 2, "y": 3}}', 'b') AS "#.b";
 #.a |       #.b
-----+------------------
 1   | {"x": 2, "y": 3}

当然,您也可以通过指定多个路径来提取子对象中内嵌的值,比如:

SELECT
    jsonb_extract_path_text('{"a": 1, "b": {"x": 2, "y": 3}}', 'b', 'x') AS "#.b.x",
    jsonb_extract_path_text('{"a": 1, "b": {"x": 2, "y": 3}}', 'b', 'y') AS "#.b.y";
 #.b.x | #.b.y
-------+-------
 2     | 3