KingbaseES Json 系列四--Json数据操作函数二(JSONB_PRETTY,JSONB_STRIP_NULLS,JSON_OBJECTAGG,JSON_EQUAL,JSON_EXISTS,JSON_STRIP_NULLS)

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"}]'); CREATE TABLE "public"."comtable" (
"id" integer NULL,
"name" character varying(10 char) NULL
); INSERT INTO "public"."comtable" ("id","name") VALUES
(1,'a'),
(2,'b'),
(3,'c');

json函数列表

json函数简介

JSONB_PRETTY

功能:

JSON函数,把 from_json 处理成一段带缩进的JSON文本。

用法:

jsonb_pretty(from_json jsonb)

示例:


demo=# SELECT jsonb_pretty('[{"f1":1,"f2":null},2,null,3]');
jsonb_pretty
--------------------
[ +
{ +
"f1": 1, +
"f2": null+
}, +
2, +
null, +
3 +
]
(1 行记录) demo=# select jsonb_pretty(jsonset) from jsontable where id = 1;;
jsonb_pretty
----------------------
[ +
{ +
"a": 1, +
"b": "bcol",+
"c": "cc" +
}, +
{ +
"a": 1, +
"b": "bcol",+
"d": "" +
} +
]
(1 行记录)

JSONB_STRIP_NULLS

功能:

JSON函数,返回 from_json ,其中所有具有空值的对象域都被过滤掉,其他空值不动。

用法:

jsonb_strip_nulls(from_json jsonb)

示例:


demo=# SELECT jsonb_strip_nulls(jsonarray),jsonarray from jsontable where id = 3;;
jsonb_strip_nulls | jsonarray
-------------------------+-------------------------------
[{"f1": 1}, 2, null, 3] | [{"f1":1,"f2":null},2,null,3]
(1 行记录)

JSON_OBJECTAGG

功能:

聚集函数,把键值对聚集成一个JSON对象。

用法1:

json_objectagg(
[ { key_expression { VALUE | ':' } value_expression } ]
[ { NULL | ABSENT } ON NULL ]
[ { WITH | WITHOUT } UNIQUE [ KEYS ] ]
[ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ]
)
key_expression { VALUE | ':' } value_expression :输入的数据聚集为一个JSON对象。
{ NULL | ABSENT } ON NULL:指定函数在key_expression计算结果为null时的行为。
{ WITH | WITHOUT } UNIQUE [ KEYS ]:定义是否允许重复键。
RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ]]:指定生成数据的类型。支持以下类型:json、jsonb、bytea和字符串类型(text、char、varchar和nchar),还支持VARCHAR2、BLOB、CLOB类型。

示例1:


-- 常用方式查询
demo=# select json_objectagg(id : name) from comtable ;
json_objectagg
-------------------------------------
{ "1" : "a", "2" : "b", "3" : "c" }
(1 行记录) demo=# select json_objectagg(id value name) from comtable ;
json_objectagg
-------------------------------------
{ "1" : "a", "2" : "b", "3" : "c" }
(1 行记录) -- json对象key字段不能为空
demo=# insert into comtable values('','a_1');
INSERT 0 1
demo=# select json_objectagg(id value name) from comtable ;
错误: 字段名不能为空 -- 重复key值限制
demo=# insert into comtable values('4','');
INSERT 0 1
demo=# select json_objectagg(id value name ) from comtable ;
json_objectagg
------------------------------------------------
{ "1" : "a", "2" : "b", "3" : "c", "1" : "d" }
(1 行记录)
demo=# select json_objectagg(id value name with unique keys) from comtable ;
错误: duplicate JSON key "1"

用法2:

json_objectagg(
[ { key_expression { VALUE | ':' } value_expression } ]
[ { NULL | ABSENT } ON NULL ]
[ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ] ]
[ { WITH | WITHOUT } UNIQUE [ KEYS ] ]
) -- 与用法1区别:returning子句与with子句位置可互换。

示例2:


demo=# select json_objectagg(id value name returning jsonb with unique keys ) from comtable;
json_objectagg
--------------------------------
{"1": "a", "2": "b", "3": "c"}
(1 行记录)

JSON_EQUAL

功能:

JSON处理函数,用于判断输入的两个文本值是否相等,前提是两个文本必须是有效的JSON值,否则返回false,当都为有效JSON值且相等则返回true,否则返回false。

用法:

json_equal( expr ,expr [{error|false|true} on error ])

expr:输入参数,可以是列名、字符串常量、复合表达式和函数表达式,数据类型必须是
字符类型变量(character [(n [char |byte])], character varying[(n [char |byte])],text,clob,blob)
{error|false|true} on error:发生错误时,默认返回true或者false。

示例:


demo=# SELECT json_equal('{"a":1}','{"a":1}') FROM dual;
json_equal
------------
t
(1 行记录) demo=# SELECT json_equal('{"a":1}','{"a":"1"}') FROM dual;
json_equal
------------
f
(1 行记录) demo=# SELECT json_equal('{"a":1}','{"a": 01}') FROM dual;
json_equal
------------
t
(1 行记录) -- 设置json解析失败的默认返回值
demo=# SELECT json_equal('{"a":1}','sdfasdf' false on error) FROM dual;
json_equal
------------
f
(1 行记录)

JSON_EXISTS

功能:

使用表达式JSON_EXISTS用于从一个输入的json文本中检索指定的jsonpath路径是否存在指定的JSON值,如果存在返回true,不存在返回false。

用法:

json_exists(
context_item, path_expression
[ PASSING { value AS varname }[, ...]]
[ RETURNING data_type ]
[ { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ]
) context_item:输入表达式
path_expression:路径表达式
[ PASSING { value AS varname }[, ...]]:使用此子句将值传递给路径表达式
[ RETURNING data_type ]:此子句指定返回的数据类型
[ { TRUE | FALSE | UNKNOWN | ERROR } ON ERROR ]:当未找到匹配值时,使用此子句返回指定的值,默认FALSE

示例:


demo=# select jsondata , json_exists(jsondata:: jsonb , '$.a') from jsontable ;
jsondata | json_exists
------------------------------------------------------+-------------
{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}} | f
{"a":[1,2,3,4,5]} | t
{"a":1, "b": ["2", "a b"],"c": {"d":4, "e": "ab c"}} | t
(3 行记录) -- path_expression模式可以选择指定关键字 lax 或 strict来声明路径模式。 默认值为 lax。
-- 在 lax 模式下,如果路径表达式包含错误,函数将返回空值。 例如,如果请求值 $.name,但 JSON 文本不包含 name 键,函数将返回 null,但不会引发错误。
-- 在 strict 模式下,如果路径表达式包含错误,函数将引发错误。 demo=# select jsondata , json_exists(jsondata:: jsonb , 'strict $.a' ERROR ON ERROR) from jsontable ;
错误: JSON对象不包含键"a" demo=# select jsondata , json_exists(jsondata:: jsonb , 'lax $.a' ERROR ON ERROR) from jsontable ;
jsondata | json_exists
------------------------------------------------------+-------------
{"f2":{"f3":1},"f4":{"f5":99,"f6":"foo"}} | f
{"a":[1,2,3,4,5]} | t
{"a":1, "b": ["2", "a b"],"c": {"d":4, "e": "ab c"}} | t
(3 行记录)

JSON_STRIP_NULLS

功能:

JSON函数,返回 from_json ,其中所有具有空值的对象域都被过滤掉,其他空值不动。

用法:

json_strip_nulls(from_json json)

示例:

参照JSONB_STRIP_NULLS使用示例

KingbaseES Json 系列四:Json数据操作函数二的更多相关文章

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

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

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

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

  3. Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数

    JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数                             ...

  4. 【summary】JQuery 相关css、ajax、数据操作函数或方法

    总结一下JQuery常用的函数方法,更加系统的整理一下. JQuery遍历的一些函数: 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集 ...

  5. ORACLE链接SQLSERVER数据库数据操作函数范例

    ORACLE链接SQLSERVER数据库数据操作函数范例 create or replace function FUN_NAME(LS_DJBH IN varchar2 ,LS_ITM varchar ...

  6. mysql四:数据操作

    一.介绍 MySQL数据操作: DML ======================================================== 在MySQL管理软件中,可以通过SQL语句中的 ...

  7. Nhibernate系列学习之(四) 数据操作

    数据操作,在这里主要介绍INSERT.UPDATE.DELETE.我们在使用NHibernate的时候,如果只是查询数据,不需要改变数据库的值,那么是不需要提交或者回滚到数据库的. 一.INSERT ...

  8. PHP文件操作函数二

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

  9. 每天十分钟系列:JS数据操作之神奇的map()

    Array.prototype.map() map()方法可以创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. demo1 上面的例子,在控制台中打印的结果是: 1 2 3 ...

  10. jQuery 数据操作函数(九)

    .clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() 从队列最前 ...

随机推荐

  1. 【framework】Activity启动流程

    1 前言 ATMS启动流程 介绍了 ActivityTaskManagerService(ATMS)的启动和初始化流程,本文将介绍 Activity 的启动流程.由于 Activity 启动流程复杂, ...

  2. At-abc342

    AtCoder Beginner Contest 342 (已更新:C D) C 似曾相识的经典映射题--而只会map的蒟蒻成功又被卡住了 简单的用map映射无法处理如r->a,a->r这 ...

  3. django学习第一天---MVC和MTV框架,request对象的属性,url路由系统

    jinja2模板渲染简单使用 下载安装 pip install jinja2 使用示例 html文件中写法 <!DOCTYPE html> <html lang="zh-C ...

  4. 数据分析day01

    数据分析三剑客 numpy pandas(重点) matplotlib numpy模块 NumPy(Numerical Python)是Python语言中做科学计算的基础库.重在于数值计算,也是大部分 ...

  5. 【Azure Key Vault】.NET 代码如何访问中国区的Key Vault中的机密信息(Get/Set Secret)

    问题描述 使用 .NET Azure.Identity 中的 DefaultAzureCredential 认证并连接到Azure Key Vault中, 在Key Vault 的示例中,并没有介绍如 ...

  6. 【Azure Redis 缓存】Redisson 连接 Azure Redis出现间歇性 java.net.UnknownHostException 异常

    问题描述 在Java项目中,使用Redisson作为连接Redis的客户端,间歇性的出现了DNS Monitor throwable 错误. DNSMonitor throwable="ja ...

  7. Isito 入门(二):Istio 的部署

    本教程已加入 Istio 系列:https://istio.whuanle.cn 目录 2,部署 Istio 安装 Helm 部署 istio-base 部署 istiod 部署 istio-ingr ...

  8. C# 多线程(17):小总结

    前言 本篇内容是小总结和过渡,看完这篇后,就要开始继续学习 C# 多线程中的知识点啦~. 前面,经过 16 篇的学习,我们学习了多线程.锁.线程池.任务.同步.异步等知识,还没有使用到 async.a ...

  9. C++ mySQL数据库连接池(windows平台)

    C++ MySQL数据库连接池 新手学了C++多线程,看了些资料练手写了C++数据库连接池小项目,自己的源码地址 关键技术点 MySQL数据库编程.单例模式.queue队列容器.C++11多线程编程. ...

  10. redis分片sharding实现原理

    为什么集群? 通常,为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取.Redis是一个很好的Cache工具.大型网站应用,热点数据量往往巨大,几十G上百G是很正常的事儿,在 ...