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记录操作函数第二部分。

  1. 准备数据:
  2. CREATE TABLE "public"."jsontable" (
  3. "id" integer NULL,
  4. "jsondata" json NULL,
  5. "jsonvarchar" varchar NULL,
  6. "jsonarray" json NULL,
  7. "jsonrecord" json NULL,
  8. "jsonset" json NULL
  9. );
  10. INSERT INTO "public"."jsontable" ("id","jsondata","jsonvarchar","jsonarray","jsonrecord","jsonset") VALUES
  11. (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":""}]'),
  12. (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":""}]'),
  13. (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 对象中的那些没有匹配到自定类型中的列名的字段将会被忽略。

用法:

  1. jsonb_populate_record(base anyelement,from_json jsonb)

示例:


  1. -- 创建自定义的 SQL 类型
  2. CREATE TYPE recordtype as (a INT, b text, c text);

  1. --解析json数据
  2. demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol","c":"c_text"}');
  3. a | b | c
  4. ---+------+--------
  5. 1 | bcol | c_text
  6. (1 行记录)
  7. -- 数据value的类型需要能够隐式转换到record的匹配类型中
  8. demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":"a","b":"bcol","c":""}');
  9. 错误: 无效的类型 integer 输入语法: "a"
  10. demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":"1","b":"bcol","c":""}');
  11. a | b | c
  12. ---+------+---
  13. 1 | bcol |
  14. (1 行记录)
  15. -- 数据中不存在record定义的属性时,默认返回null
  16. demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol"}');
  17. a | b | c
  18. ---+------+---
  19. 1 | bcol |
  20. (1 行记录)
  21. -- 数据中多余的属性时,默认忽略
  22. demo=# SELECT * FROM jsonb_populate_record(NULL::recordtype , '{"a":1,"b":"bcol","c":"c_text","d":"dcol"}');
  23. a | b | c
  24. ---+------+--------
  25. 1 | bcol | c_text
  26. (1 行记录)
  27. -- 通过设置record转换类型,设置数据不存在时默认值
  28. demo=# SELECT * FROM jsonb_populate_record((0 , 'b_default' , 'not exist' )::recordtype , '{"a":1,"b":"bcol"}');
  29. a | b | c
  30. ---+------+-----------
  31. 1 | bcol | not exist
  32. (1 行记录)
  33. -- 从表字段中解析数据
  34. demo=# SELECT jt.jsonrecord ,jpr.* FROM jsontable jt , jsonb_populate_record(NULL::recordtype , jt.jsonrecord) jpr;
  35. jsonrecord | a | b | c
  36. -----------------------------+---+------+----
  37. {"a":1,"b":"bcol","c":"cc"} | 1 | bcol | cc
  38. {"a":1,"b":"bcol","c":""} | 1 | bcol |
  39. {"a":1,"b":"bcol","d":"dd"} | 1 | bcol |
  40. (3 行记录)
  41. -- 通过设置record转换类型,设置数据不存在时默认值
  42. demo=# SELECT jt.jsonrecord ,jpr.* FROM jsontable jt , jsonb_populate_record((0 , 'not exist' , 'not exist')::recordtype , jt.jsonrecord) jpr;
  43. jsonrecord | a | b | c
  44. -----------------------------+---+------+-----------
  45. {"a":1,"b":"bcol","c":"cc"} | 1 | bcol | cc
  46. {"a":1,"b":"bcol","c":""} | 1 | bcol |
  47. {"a":1,"b":"bcol","d":"dd"} | 1 | bcol | not exist
  48. (3 行记录)

JSONB_POPULATE_RECORDSET

功能:

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

用法:

  1. jsonb_populate_recordset(base anyelement,from_json jsonb)

示例:

  1. CREATE TYPE recordtype as (a INT, b text, c text);

  1. -- 直接解析json数据
  2. demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","c":"c_dd"}]');
  3. a | b | c
  4. ---+------+------
  5. 1 | bcol | cc
  6. 1 | bcol | c_dd
  7. (2 行记录)
  8. -- 数据value的类型需要能够隐式转换到record的匹配类型中
  9. demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":"a","b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
  10. 错误: 无效的类型 integer 输入语法: "a"
  11. demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
  12. a | b | c
  13. ---+------+----
  14. 1 | bcol | cc
  15. 1 | bcol |
  16. (2 行记录)
  17. -- 数据中不存在record定义的属性时,默认返回null
  18. -- 数据中多余的属性时,默认忽略
  19. demo=# SELECT * FROM jsonb_populate_recordset(NULL::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
  20. a | b | c
  21. ---+------+----
  22. 1 | bcol | cc
  23. 1 | bcol |
  24. (2 行记录)
  25. -- 通过设置record转换类型,设置数据不存在时默认值
  26. demo=# SELECT * FROM jsonb_populate_recordset((0 , 'b_default' , 'not exist' )::recordtype , '[{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}]');
  27. a | b | c
  28. ---+------+-----------
  29. 1 | bcol | cc
  30. 1 | bcol | not exist
  31. (2 行记录)
  32. -- 从表字段中解析数据
  33. demo=# SELECT jt.jsonset ,jpr.* FROM jsontable jt , jsonb_populate_recordset(NULL::recordtype , jt.jsonset) jpr;
  34. jsonset | a | b | c
  35. -------------------------------------------------------------------+---+------+--------
  36. [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}] | 1 | bcol | cc
  37. [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}] | 1 | bcol |
  38. [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}] | 1 | bcol |
  39. [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}] | 1 | bcol |
  40. [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_1
  41. [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_2
  42. (6 行记录)
  43. -- 通过设置record转换类型,设置数据不存在时默认值
  44. demo=# SELECT jt.jsonset ,jpr.* FROM jsontable jt , jsonb_populate_recordset((0 , 'not exist' , 'not exist')::recordtype , jt.jsonset) jpr;
  45. jsonset | a | b | c
  46. -------------------------------------------------------------------+---+------+-----------
  47. [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}] | 1 | bcol | cc
  48. [{"a":1,"b":"bcol","c":"cc"},{"a":1,"b":"bcol","d":""}] | 1 | bcol | not exist
  49. [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}] | 1 | bcol |
  50. [{"a":1,"b":"bcol","c":""},{"a":1,"b":"bcol","e":""}] | 1 | bcol | not exist
  51. [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_1
  52. [{"a":1,"b":"bcol","c":"cc_3_1"},{"a":1,"b":"bcol","c":"cc_3_2"}] | 1 | bcol | cc_3_2
  53. (6 行记录)

JSON_POPULATE_RECORD

功能:

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

用法:

  1. json_populate_record(base anyelement,from_json jsonb)

示例:

  1. 参照JSONB_POPULATE_RECORD使用示例

JSON_POPULATE_RECORDSET

功能:

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

用法:

  1. json_populate_record(base anyelement,from_json jsonb)

示例:

  1. 参照JSONB_POPULATE_RECORDSET使用示例

KingbaseES Json 系列七:Json记录操作函数二的更多相关文章

  1. Apache Kafka系列(七)Kafka Repartition操作

    Kafka提供了重新分区的命令,但是只能增加,不能减少 我的kafka安装在/usr/local/kafka_2.12-1.0.2目录下面, [root@i-zk1 kafka_2.-]# bin/k ...

  2. PHP文件操作函数二

    PHP部分文件访问函数总结: 1.filetype("文件路径")  //可以输出相关文件类型,返回之为:dir/file... 2.stat("文件名") / ...

  3. Python股票分析系列——基础股票数据操作(二).p4

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...

  4. SQL学习记录:函数(二)

    字符串函数 1.获取字符的ASCII码 语法结构: ASCII(espression)    这里的expression是一个返回char或varchar数据类型的表达式,ASCII函数仅对表达式最左 ...

  5. Python 字符串操作函数二

    #-*- coding:utf-8 -*- line = "l want watch movie with you ." print(line.center(50)) print( ...

  6. Python股票分析系列——基础股票数据操作(一).p3

    该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...

  7. Android(java)学习笔记208:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  8. Android(java)学习笔记151:Android中操作JSON数据(Json和Jsonarray)

    1.Json 和 Xml       JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.它基于ECMAScript的一个子集. JSON采用完全独立于语言的 ...

  9. JavaScript操作JSON的方法总结,JSON字符串转换为JSON对象

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

  10. Web API删除JSON格式的文件记录

    Insus.NET的系列Web Api学习文章,这篇算是计划中最后一篇了,删除JSON格式的文件记录.前一篇<Web Api其中的PUT功能演示>http://www.cnblogs.co ...

随机推荐

  1. springboot和jquery.form.js实现监听文件上传进度

    说明 文件上传作为程序开发最常用的功能之一,上传进度展示也是必须的.但是有时候进度并不准,进度100%了实际上后台尚未接收完毕,本篇就介绍如何利用jquery的form插件来实时反馈文件上传进度. 实 ...

  2. java利用hdfs api进行上传下载操作

    1.说明 最近项目中一部分大文件需要存储到hadoop的hdfs组件中,自己本地用3台centos7虚拟机搭建了一套集群.本地写点java代码测试一下. 代码部分改编自网络. 环境说明 一主二仆结构. ...

  3. 关于动态抽样(Dynamic Sampling)

    关于动态抽样(Dynamic Sampling) 原文:http://www.oracle.com/technetwork/issue-archive/2009/09-jan/o19asktom-08 ...

  4. 【Azure Redis 缓存】Azure Redis 4.0 被扫描到漏洞,如何修补呢?

    问题描述 在安全级别要求高的公司中,任何系统都会进行安全扫描.比如Azure 云上的Redis服务,也在扫描的范围中,最后发现Redis 4.0存在以下漏洞: CVE-2019-10192:https ...

  5. 【Azure 应用服务】App Service 项目部署成功后,应用连接 Azure Redis时报错 Could not get a resource from the pool

    问题描述 App Service 项目部署成功后,需要连接到同在云上的Redis服务, Redis启动了专用终结点,只能在于Redis同一个VNET(虚拟网络)的资源能够访问.在进入App Servi ...

  6. [C/C++] PCWSTR LPCTSTR等等

    目录 为什么会有这个 L"" 宏 LPCWSTR字符串比较 wchar_t 和 char 之间转换 关于 ANSI编码 乌拉~~~ 这是我第一百篇博文咯~ 为什么会有这个 真的开发 ...

  7. Java 多线程------创建多线程的方式二:实现 Runnable接口 + 比较创建线程的两种方式:

    1 package com.bytezero.threadexer; 2 3 /** 4 * 5 * 创建多线程的方式二:实现 Runnable接口 6 * 1.创建一个实现了Runnable接口类 ...

  8. 10、zookeeper的leader选举

    leader选举 服务器状态 looking:寻找leader状态.当服务器处于该状态时,它会认为当前集群中没有leader,因此需要进入leader选举状态 following:跟随着状态.表明当前 ...

  9. STM32F103xC,xD,xE引脚定义

    STM32F103xC,xD,xE引脚定义 由于在使用STM32系列芯片过程中发现互联网没有整理好的引脚定义,因此自己整理一份,方便以后查阅. GPIOA Pin 重新上电时的功能 默认功能 重映射 ...

  10. 苹果AppleMacOs系统Sonoma本地部署无内容审查(NSFW)大语言量化模型Causallm

    最近Mac系统在运行大语言模型(LLMs)方面的性能已经得到了显著提升,尤其是随着苹果M系列芯片的不断迭代,本次我们在最新的MacOs系统Sonoma中本地部署无内容审查大语言量化模型Causallm ...