金仓数据库KingbaseES Json 系列七:Json记录操作函数二

KingbaseES Json 系列七--Json记录操作函数二

(JSONB_POPULATE_RECORD,JSONB_POPULATE_RECORDSET,JSON_POPULATE_RECORD,JSON_POPULATE_RECORDSET)

JSON 数据类型是用来存储 JSON(JavaScript Object Notation)数据的。KingbaseES为存储JSON数据提供了两种类型:JSON和 JSONB。JSON 和 JSONB 几乎接受完全相同的值集合作为输入。

本文将主要介绍Kingbase数据库的Json记录操作函数第二部分。

准备数据:

CREATE TABLE "public"."jsontable" (
    "id" integer NULL,
    "jsondata" json NULL,
    "jsonvarchar" varchar NULL,
    "jsonarray" json NULL,
    "jsonrecord" json NULL,
    "jsonset" json NULL
);

INSERT INTO "public"."jsontable" ("id","jsondata","jsonvarchar","jsonarray","jsonrecord","jsonset") VALUES
     (1,'{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}}','{"f2": {"f3": 1}, "f4": {"f5": 99, "f6": "foo"}}','[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"]','{"a":1,"b":"bcol","c":"cc"}','[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]'),
     (2,'{"a":[1,2,3,4,5]}','{"a": [1, 2, 3, 4, 5]}','[1,2,3,4,5]','{"a":1,"b":"bcol","c":""}','[{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]'),
     (3,'{"a":1, "b": ["2", "a b"],"c": {"d":4, "e": "ab c"}}','{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}','[{"f1":1,"f2":null},2,null,3]','{"a":1,"b":"bcol","d":"dd"}','[{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}]');

json函数列表

json函数简介

JSONB_POPULATE_RECORD

功能:

JSON函数,扩展 from_json 中的对象成一个行,它的列匹配由 base 定义的记录类型。在 JSONB 对象的那些与自定义类型中的列名匹配的字段,他们的值将被插入到对应的输出的列中。而 JSONB 对象中的那些没有匹配到自定类型中的列名的字段将会被忽略。

用法:
jsonb_populate_record(base anyelement,from_json jsonb)
示例:
-- 创建自定义的 SQL 类型

CREATE TYPE recordtype as (a INT, b text, c text);
--解析json数据

demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol","c":"c_text"}');
 a |  b   |   c    
---+------+--------
 1 | bcol | c_text
(1 行记录)

-- 数据value的类型需要能够隐式转换到record的匹配类型中

demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":"a","b":"bcol","c":""}');
错误:  无效的类型 integer 输入语法: "a"

demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":"1","b":"bcol","c":""}');
 a |  b   | c 
---+------+---
 1 | bcol | 
(1 行记录)

-- 数据中不存在record定义的属性时,默认返回null

demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol"}');       
 a |  b   | c 
---+------+---
 1 | bcol | 
(1 行记录)

-- 数据中多余的属性时,默认忽略

demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol","c":"c_text","d":"dcol"}'); 
 a |  b   |   c    
---+------+--------
 1 | bcol | c_text
(1 行记录)

-- 通过设置record转换类型,设置数据不存在时默认值

demo=# SELECT * FROM jsonb_populate_record((0 , 'b_default' , 'not exist' )::recordtype , '{"a":1,"b":"bcol"}');
 a |  b   |     c     
---+------+-----------
 1 | bcol | not exist
(1 行记录)

-- 从表字段中解析数据

demo=# SELECT jt.jsonrecord ,jpr.*  FROM jsontable jt , jsonb_populate_record(NULL::recordtype , jt.jsonrecord) jpr;
         jsonrecord          | a |  b   | c  
-----------------------------+---+------+----
 {"a":1,"b":"bcol","c":"cc"} | 1 | bcol | cc
 {"a":1,"b":"bcol","c":""}   | 1 | bcol | 
 {"a":1,"b":"bcol","d":"dd"} | 1 | bcol | 
(3 行记录)

-- 通过设置record转换类型,设置数据不存在时默认值

demo=# SELECT jt.jsonrecord ,jpr.*  FROM jsontable jt , jsonb_populate_record((0 , 'not exist' , 'not exist')::recordtype , jt.jsonrecord) jpr;
         jsonrecord          | a |  b   |     c     
-----------------------------+---+------+-----------
 {"a":1,"b":"bcol","c":"cc"} | 1 | bcol | cc
 {"a":1,"b":"bcol","c":""}   | 1 | bcol | 
 {"a":1,"b":"bcol","d":"dd"} | 1 | bcol | not exist
(3 行记录)

JSONB_POPULATE_RECORDSET

功能:

JSON函数,扩展 from_json 中最外层的对象数组成一个集合,它的列匹配由 base 定义的记录类型。

用法:
jsonb_populate_recordset(base anyelement,from_json jsonb)
示例:
CREATE TYPE recordtype as (a INT, b text, c text);
-- 直接解析json数据

demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","c":"c_dd"}]');
 a |  b   |  c   
---+------+------
 1 | bcol | cc
 1 | bcol | c_dd
(2 行记录)

-- 数据value的类型需要能够隐式转换到record的匹配类型中

demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":"a","b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
错误:  无效的类型 integer 输入语法: "a"

demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');  
 a |  b   | c  
---+------+----
 1 | bcol | cc
 1 | bcol | 
(2 行记录)

-- 数据中不存在record定义的属性时,默认返回null
-- 数据中多余的属性时,默认忽略

demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
 a |  b   | c  
---+------+----
 1 | bcol | cc
 1 | bcol | 
(2 行记录)

-- 通过设置record转换类型,设置数据不存在时默认值

demo=# SELECT * FROM jsonb_populate_recordset((0 , 'b_default' , 'not exist' )::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
 a |  b   |     c     
---+------+-----------
 1 | bcol | cc
 1 | bcol | not exist
(2 行记录)

-- 从表字段中解析数据

demo=# SELECT jt.jsonset ,jpr.*  FROM jsontable jt , jsonb_populate_recordset(NULL::recordtype , jt.jsonset) jpr;
                              jsonset                              | a |  b   |   c    
-------------------------------------------------------------------+---+------+--------
 [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]           | 1 | bcol | cc
 [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]           | 1 | bcol | 
 [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]             | 1 | bcol | 
 [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]             | 1 | bcol | 
 [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_1
 [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_2
(6 行记录)

-- 通过设置record转换类型,设置数据不存在时默认值

demo=# SELECT jt.jsonset ,jpr.*  FROM jsontable jt , jsonb_populate_recordset((0 , 'not exist' , 'not exist')::recordtype , jt.jsonset) jpr;
                              jsonset                              | a |  b   |     c     
-------------------------------------------------------------------+---+------+-----------
 [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]           | 1 | bcol | cc
 [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]           | 1 | bcol | not exist
 [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]             | 1 | bcol | 
 [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}]             | 1 | bcol | not exist
 [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_1
 [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_2
(6 行记录)

JSON_POPULATE_RECORD

功能:

JSON函数,扩展 from_json 中的对象成一个行,它的列匹配由 base 定义的记录类型。

用法:
json_populate_record(base anyelement,from_json jsonb)
示例:
参照JSONB_POPULATE_RECORD使用示例

JSON_POPULATE_RECORDSET

功能:

JSON函数,扩展 from_json 中最外层的对象数组成一个集合,它的列匹配由 base 定义的记录类型。

用法:
json_populate_record(base anyelement,from_json jsonb)
示例:
参照JSONB_POPULATE_RECORDSET使用示例
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值