JSONB_OBJECT
功能描述
Vastbase在PostgreSQL兼容模式下支持JSONB_OBJECT函数,用于从一个文本数组构建一个JSONB对象,或者从两个分别作为键和值的数组构建一个JSONB对象。
其中文本数组可以是具有偶数个成员的一维数组(成员被当做交替出现的键/值对),或者是一个二维数组(每一个内部数组刚好有偶数个元素,则每 2 个元素可以被看做是键/值对)。
注意事项
该功能仅在数据库兼容模式为PostgreSQL时支持(即数据库实例初始化时指定DBCOMPATIBILITY='PG')。
入参数组维度必须合理,且键不可为null,否则函数报错。
两个数组参数形式中的键数组和值数组必须具有相同数量的元素, 否则函数报错。
语法格式
JSONB_OBJECT函数有两个重载函数:
当入参为一个文本数组的时候,其数组长度必须为偶数,成员被当做交替出现的键/值对,键不可为null,返回类型为jsonb。
jsonb_object(kv_array)
当入参为两个文本数组的时候,第一个数组认为是键,第二个认为是值,两个数组长度必须相等,键不可为null,返回类型为jsonb。
jsonb_object(k_array, v_array)
参数说明
kv_array
一个文本数组。
可以是一个一维数组,必须由偶数个元素,且由交替的作为键和值的元素组成。
也可以是一个二维数组,且每个内部数组必须具有两个元素,作为键和值。
k_array
一个包含了键的文本数组。其中的元素和值数组中的元素一一对应组成键值对。
v_array
一个包含了值的文本数组。其中的元素和键数组中的元素一一对应组成键值对。
示例
示例1: 指定字符数组类型。
select jsonb_object('{1,2,a,b}'::char[]) ;
select jsonb_object('{abcd,efg,a4a,@3$}'::varchar[]) ;
返回结果为如下,第一个查询语句中1和a被用作键,2和b被用作值;第二个查询语句中abcd和a4a被用作键,efg和@3$被用作值:
jsonb_object
----------------------
{"1": "2", "a": "b"}
(1 row)
jsonb_object
-------------------------------
{"a4a": "@3$", "abcd": "efg"}
(1 row)
示例2: 在测试表中设置列默认值为JSONB_OBJECT函数输出值。
1、创建测试表,为列指定默认值。
create table tb1_1164188(a1 int[] primary key,a2 jsonb not null,a3 jsonb default jsonb_object('{id}','{00001111}'),a4 date[] unique,a5 int check (a5>5),a6 text[],a7 text[]);
create table tb2_1164188(a1 int primary key,a2 jsonb default jsonb_object('{id,name}','{00001111,lili}'),a3 date);
2、为测试表插入数据。
insert into tb1_1164188 values('{1,2}','"a"',default,'{2022-12-12,2022-12-12}',7,'{1,2,3,4,5}','{a,b,c,d,e}');
insert into tb2_1164188(a1) select generate_series(4,9);
3、查询测试表的数据。
select * from tb1_1164188;
select * from tb2_1164188;
返回结果为如下:
a1 | a2 | a3 | a4 | a5 | a6 | a7
-------+-----+--------------------+-------------------------+----+-------------+-------------
{1,2} | "a" | {"id": "00001111"} | {2022-12-12,2022-12-12} | 7 | {1,2,3,4,5} | {a,b,c,d,e}
(1 row)
a1 | a2 | a3
----+------------------------------------+----
4 | {"id": "00001111", "name": "lili"} |
5 | {"id": "00001111", "name": "lili"} |
6 | {"id": "00001111", "name": "lili"} |
7 | {"id": "00001111", "name": "lili"} |
8 | {"id": "00001111", "name": "lili"} |
9 | {"id": "00001111", "name": "lili"} |
(6 rows)