PostgreSQL json_populate_record() 函数使用指南
PostgreSQL json_populate_record() 函数将指定的最顶层的 JSON 对象转为一个自定义的 SQL 类型值。
json_populate_record() 语法
这是 PostgreSQL json_populate_record() 函数的语法:
json_populate_record(base ANYELEMENT, from_json JSON) -> ANYELEMENT
参数
base- 必需的。 一个任何数据类型的值。 它指明了 JSON 对象要转为的值的类型。
from_json- 必需的。 要转的 JSON 对象。
返回值
PostgreSQL json_populate_record() 函数返回一个指定的的 SQL 类型值,它由指定的 JSON 对象转化而来。
在 JSON 对象的那些与自定义类型中的列名匹配的字段,他们的值将被插入到对应的输出的列中。而 JSON 对象中的那些没有匹配到自定类型中的列名的字段将会被忽略。
json_populate_record() 函数按照如下的规则的将 JSON 值转为 SQL 类型的值:
- JSON null 将被转为 SQL null。
- 如果输出列的类型为
JSON或者JSONB,JSON 值将被精确的复制。 - 如果输出列是组合类型,并且 JSON 值是对象,则通过递归应用这些规则,将对象的字段转换为输出行类型的列。
- 如果输出列是数组类型并且 JSON 值是 JSON 数组,则通过递归应用这些规则,将 JSON 数组的元素转换为输出数组的元素。
- 否则,如果 JSON 值是字符串,则将字符串的内容将被送到该列数据类型对应的输入转换函数。
- 否则,JSON 值的普通文本表示将被送到该列数据类型的输入转换函数。
在典型使用中,base 的值为 NULL,这意味着任何不与 JSON 对象中的字段匹配的输出列都将用空值填充。 如果 base 的值不为 NULL,则它包含的值将被用于不匹配的列中。
通常,我们可以使用 CREATE TYPE 创建一个自定义类型,它定义了要输出的列以及每个列的类型。
json_populate_record() 示例
本示例展示了如何使用 PostgreSQL json_populate_record() 函数将一个 JSON 对象转为一个自定义 SQL 类型的值。
首先,让我们创建两个自定义的 SQL 类型:
CREATE TYPE address as (country TEXT, city TEXT);
CREATE TYPE person as (name TEXT, age INT, hobbies TEXT[], address address);
这里,我们创建了两个自定类型 address 和 person,其中 person 内部使用了 address。
然后,让我们使用下面的语句将 JSON 对象转为刚刚创建的类型 person:
SELECT
*
FROM
json_populate_record(
null::person,
'{"name": "Tom", "age": 20, "hobbies": ["sports", "cars"], "address": {"country": "CN", "city": "BeiJing"}}'
);
name | age | hobbies | address
------+-----+---------------+--------------
Tom | 20 | {sports,cars} | (CN,BeiJing)我们可以使用一个不为 NULL 的 base 参数,以便未输出中的未匹配的列填充一个值,比如:
SELECT
*
FROM
json_populate_record(
('x', 0, ARRAY['sports'], ('CN', 'BeiJing'))::person,
'{"name": "Tom", "age": 20, "hobbies": ["sports", "cars"]}'
);
name | age | hobbies | address
------+-----+---------------+--------------
Tom | 20 | {sports,cars} | (CN,BeiJing)这里,我们的 base 参数为 ('x', 0, ARRAY['sports'], ('CN', 'BeiJing'))::person,其中 address 列的值为 ('CN', 'BeiJing')。 虽然给定的 JSON 对象中没有 address 字段,但是输出中的列 address 被 base 参数中的值填充。