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. Swoole从入门到入土(2)——TCP服务器[初步接触]

    我们知道Swoole弥补了PHP没办法实现长连接的短板,在接下来的话题中,我们会从TCP服务器.HTTP服务器.WebSocket服务器.协程.管道.中间件等话题,一个个进行讨论. 1.开篇 我们以S ...

  2. spring boot结合ehcache防止恶意刷新请求

    说明 我们在把开发好的网站上线之前一定要考虑到别人恶意刷新你的网页这种情况,最大限度的去限制他们.否则往往这将搞垮你的应用服务器,想象一下某个恶意用户利用众多肉鸡在1分钟内请求你网页几十万次是个什么情 ...

  3. spring boot读取json文件并实现接口查询

    0.源码下载 https://download.csdn.net/download/IndexMan/84238085 1.说明 最近需要在spring boot项目启动时读取json文件并保存到Li ...

  4. Linux上安装和部署git

    本机环境: [git@rhel-server .ssh]$ cat /proc/version Linux version 2.6.32-358.el6.x86_64 1.安装 yum install ...

  5. win32- 使用WM_NCPAINT在非客户区域绘制边框

    #pragma comment(lib, "UxTheme") #include <windows.h> #include <uxtheme.h> LRES ...

  6. 【Azure K8S|AKS】进入AKS的POD中查看文件,例如PVC Volume Mounts使用情况

    问题描述 在昨天的文章中,创建了 Disk + PV + PVC + POD 方案(https://www.cnblogs.com/lulight/p/17604441.html),那么如何进入到PO ...

  7. 【Azure 应用服务】NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问

    问题描述 NodeJS项目部署在App Service For Linux环境中,部署完成后应用无法访问,在启动日志中发现错误消息:ERROR - Container XXX_0 for site X ...

  8. 【Azure Redis 缓存】VM 里的 Redis 能直接迁移到 Azure Cache for Redis ? 需要改动代码吗?

    问题描述 原来部署在VM 里的 Redis 能直接迁移到 Azure Cache for Redis? 需要改动代码吗? 问题解答 以上问题需要从两个方面来解答. 第一:VM中Redis的数据转移到 ...

  9. idea导入spring源码运行缺失cglib和objenesis的jar包的办法【亲测有效】

    idea导入spring源码运行缺失cglib和objenesis的jar包的办法[亲测有效] 亲测有效,网上说的大多废话 上图,操作如下,运行gradle

  10. spingboot打造教育平台(谷粒学院课程笔记)

    第一单fqb  申明,项目的框架技术架构,前端运行时node   后端框架spring  开发前准备:mysbatis官网随时看文档,IDEa 202编释器2  环境配置,idea配置一下mavem路 ...