PostgreSQL json_populate_recordset() 函数使用指南

PostgreSQL json_populate_recordset() 函数将指定的最顶层的 JSON 数组转为一个自定义的 SQL 类型值的集合。

json_populate_recordset() 语法

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

json_populate_recordset(base ANYELEMENT, from_json JSON) -> SETOF ANYELEMENT

参数

base
必需的。 一个任何数据类型的值。 它指明了数组中的 JSON 对象要转为的值的类型。
from_json
必需的。 要转的 JSON 数组,其中的元素为 JSON 对象。

返回值

PostgreSQL json_populate_recordset() 函数返回一个自定义的 SQL 类型值的集合,它由指定的 JSON 数组转化而来。 JSON 数组中的每个 JSON 对象都依照 json_populate_record() 函数处理成自定义类型的值。

我们可以使用 CREATE TYPE 创建一个自定义类型,它定义了要输出的列以及每个列的类型。

json_populate_recordset() 示例

本示例展示了如何使用 PostgreSQL json_populate_recordset() 函数将一个 JSON 数组转为一个自定义 SQL 类型的值。

首先,让我们创建一个自定义的 SQL 类型:

CREATE TYPE my_type as (x TEXT, y INT, z TEXT);

这里,我们创建了一个自定类型 my_type,它包含 3 个列 x, y, 和 z

然后,让我们使用下面的语句将 JSON 数组转为 my_type 的集合:

SELECT
  *
FROM
  json_populate_recordset(
    null::my_type,
    '[{"x": "A", "y": 1}, {"x": "B", "y": 2}]'
  );
 x | y | z
---+---+---
 A | 1 |
 B | 2 |

这里, 由于列 z 在 JSON 对象没有匹配的字段,因此列 z 中的值为 NULL。如果我们想在列 z 中使用一个固定的值,我们可以使用一个不为 null 的 base 参数:

SELECT
  *
FROM
  json_populate_recordset(
    ('x', 0, 'z')::my_type,
    '[{"x": "A", "y": 1}, {"x": "B", "y": 2}]'
  );
 x | y | z
---+---+---
 A | 1 | z
 B | 2 | z

这里,由于 base 参数不为 null 且列 z 在 JSON 对象没有匹配的字段,因此 base 中的 z 列的值被填充到输出的 z 列中。