KingbaseES Json 系列五--Json数据操作函数三
KingbaseES Json 系列五:Json数据操作函数三(JSONB_SET,JSONB_INSERT,JSON_QUERY)
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_SET
功能:
JSON函数,返回 target 其中由 path 指定的节用 new_value 替换,如果指定的项不存在并且 create_missing 为真(默认为真)则加上 new_value 。正如面向路径的操作符一样,出现在 path 中的负整数表示从JSON数组的末尾开始数
用法:
jsonb_set(target jsonb, path text[],new_value jsonb[, create_missing boolean])
示例:
-- json数组中,path值'{p1,p2}',p1:表示数组位置;p2:表示具体的key值。
demo=# SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}', '[2,3,4]', false);
jsonb_set
---------------------------------------------
[{"f1": [2, 3, 4], "f2": null}, 2, null, 3]
(1 行记录)
-- 在数组json中,进行value替换
demo=# select jsonarray , jsonb_set(jsonarray::jsonb , '{0}' ,'[9]' ,false) from jsontable ;
jsonarray | jsonb_set
---------------------------------------------------------------+------------------------------------------------------------------------------
[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"] | [[9], true, [1, [2, 3]], null, {"f1": 1, "f2": [7, 8, 9]}, false, "stringy"]
[1,2,3,4,5] | [[9], 2, 3, 4, 5]
[{"f1":1,"f2":null},2,null,3] | [[9], 2, null, 3]
(3 行记录)
demo=# select jsonarray , jsonb_set(jsonarray::jsonb , '{0}' ,'9' ,false) from jsontable ;
jsonarray | jsonb_set
---------------------------------------------------------------+----------------------------------------------------------------------------
[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"] | [9, true, [1, [2, 3]], null, {"f1": 1, "f2": [7, 8, 9]}, false, "stringy"]
[1,2,3,4,5] | [9, 2, 3, 4, 5]
[{"f1":1,"f2":null},2,null,3] | [9, 2, null, 3]
(3 行记录)
demo=# select jsonarray , jsonb_set(jsonarray::jsonb , '{0}' ,'true' ,false) from jsontable ;
jsonarray | jsonb_set
---------------------------------------------------------------+-------------------------------------------------------------------------------
[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"] | [true, true, [1, [2, 3]], null, {"f1": 1, "f2": [7, 8, 9]}, false, "stringy"]
[1,2,3,4,5] | [true, 2, 3, 4, 5]
[{"f1":1,"f2":null},2,null,3] | [true, 2, null, 3]
(3 行记录)
demo=# select jsonarray , jsonb_set(jsonarray::jsonb , '{0}' ,'"a"' ,false) from jsontable ;
jsonarray | jsonb_set
---------------------------------------------------------------+------------------------------------------------------------------------------
[1,true,[1,[2,3]],null,{"f1":1,"f2":[7,8,9]},false,"stringy"] | ["a", true, [1, [2, 3]], null, {"f1": 1, "f2": [7, 8, 9]}, false, "stringy"]
[1,2,3,4,5] | ["a", 2, 3, 4, 5]
[{"f1":1,"f2":null},2,null,3] | ["a", 2, null, 3]
(3 行记录)
-- json对象值替换
demo=# select jsonrecord , jsonb_set(jsonrecord , '{a}' ,'2' ,false ) from jsontable ;
jsonrecord | jsonb_set
-----------------------------+----------------------------------
{"a":1,"b":"bcol","c":"cc"} | {"a": 2, "b": "bcol", "c": "cc"}
{"a":1,"b":"bcol","c":""} | {"a": 2, "b": "bcol", "c": ""}
{"a":1,"b":"bcol","d":"dd"} | {"a": 2, "b": "bcol", "d": "dd"}
(3 行记录)
-- json对象或者所在位置不存在时,忽略值
demo=# SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f3}', '[2,3,4]', false);
jsonb_set
-------------------------------------
[{"f1": 1, "f2": null}, 2, null, 3]
(1 行记录)
demo=# SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{8}', '[2,3,4]', false);
jsonb_set
-------------------------------------
[{"f1": 1, "f2": null}, 2, null, 3]
(1 行记录)
-- 指定的项不存在并且create_missing 为真(默认为真)则加上 new_value
demo=# SELECT jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f3}', '[2,3,4]', true);
jsonb_set
------------------------------------------------------
[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2, null, 3]
(1 行记录)
JSONB_INSERT
功能:
JSON处理函数,返回被插入了 new_value 的 target 。如果 path 指定的 target 节在一个JSONB数组中, new_value 将被插入到目标之前( insert_after 默认为false)或者之后( insert_after 为true)。如果 path 指定的 target 节在一个JSONB对象内,则只有当 target 不存在时才插入 new_value。对于面向路径的操作符来说,出现在 path 中的负整数表示从JSONB数组的末尾开始计数。
用法:
jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])
示例:
-- 插入新值数据
demo=# SELECT JSONB_INSERT('[{"f1":1,"f2":null},2,null,3]', '{0,f3}', '[2,3,4]', false);
JSONB_INSERT
------------------------------------------------------
[{"f1": 1, "f2": null, "f3": [2, 3, 4]}, 2, null, 3]
(1 行记录)
-- 值存在时,不进行替换
demo=# SELECT JSONB_INSERT('[{"f1":1,"f2":null},2,null,3]', '{0,f2}', '[2,3,4]', false);
错误: 不能替换已经存在的键
提示: 尝试使用 jsonb_set 来替换键值。
-- 通过参数insert_after设置插入位置之前或之后
demo=# SELECT JSONB_INSERT('[{"f1":1,"f2":null},2,null,3]', '{1}', '[2,3,4]', false );
JSONB_INSERT
------------------------------------------------
[{"f1": 1, "f2": null}, [2, 3, 4], 2, null, 3]
(1 行记录)
demo=# SELECT JSONB_INSERT('[{"f1":1,"f2":null},2,null,3]', '{1}', '[2,3,4]', true );
JSONB_INSERT
------------------------------------------------
[{"f1": 1, "f2": null}, 2, [2, 3, 4], null, 3]
(1 行记录)
JSON_QUERY
功能:
JSON函数,用于从一个输入的json文本中根据指定的jsonpath路径检索所需的值(可以为标量值,也可以为对象或者数组)。
用法:
json_query (
expression [FORMAT JSON [ENCODING UTF8]],JSON_basic_path_expression
[ PASSING { value AS varname } [, ...]]
[ RETURNING data_type [ FORMAT JSON [ ENCODING UTF8 ] ]
[ { WITHOUT | WITH { CONDITIONAL | [UNCONDITIONAL] } } [ ARRAY ] WRAPPER ]
[ { KEEP | OMIT } QUOTES [ ON SCALAR STRING ] ]
[{ERROR|NULL|EMPTY|EMPTY ARRAY|EMPTY OBJECT|DEFAULT expression } ON EMPTY ]
[{ERROR|NULL|EMPTY|EMPTY ARRAY|EMPTY OBJECT|DEFAULT expression } ON ERROR ]
)
expression:输入的json文本,完整的支持可以为字符常量、函数、或者列名(数据类型为clob,blob或者varchar2),V8R6C7版本只支持输入类型为JSONB类型,其他类型后续补充;
FORMAT JSON:是在expression为字符串类型时将expression格式化成json格式。
ENCODING UTF8:指定输入为二进制类型时的字符集。
json_basic_path_expression:用于指定json文件所要查询的路径。
PASSING { value AS varname } [, ...]:将varname变量的值替换成value进行查询,需要注意
a.varname为非限定标识符(不带双引号)时会自动转换为小写,为限定标识符(带双引号)时原样存储不进行大小写转换。
b.varname的数据类型应与检索值相同。
RETURNING data_type:指定返回值的数据类型。
{ WITHOUT | WITH { CONDITIONAL | [UNCONDITIONAL] } } [ ARRAY ] WRAPPER:控制JSON_QUERY函数返回值是否用方括号“[]”包围。
a.WITHOUT WRAPPER:默认选项,返回值不用‘[]’包围。
b.WITH WRAPPER:返回值用‘[]’包围,等价于WITH ARRAY WRAPPER。
c.WITH UNCONDITIONAL WRAPPER:等价于WITH WRAPPER.
d.WITH CONDITIONAL WRAPPER:
* 如果匹配到多个值或单个标量值,与WITH WRAPPER相同;
* 如果匹配到单个对象或者数组,与WITHOUT WRAPPER相同。
{ KEEP | OMIT } QUOTES [ ON SCALAR STRING ]:Quotes子句指定当返回值为标量字符串时是否保留双引号(“”).
a.指定KEEP时保留,此为默认选项;
b.指定OMIT时不保留。
c.QUOTES子句不能与WITH WRAPPER子句共用。
d.ON SCALAR STRING关键字只为语法清晰,添加与否对结果无影响。
{ERROR|NULL|EMPTY|EMPTY ARRAY|EMPTY OBJECT|DEFAULT expression } ON ERROR:指定错误发生时的返回值。
a.NULL ON ERROR - 返回NULL,此为默认选项
b.ERROR ON ERROR - 报错
c.EMPTY ON ERROR - 等价于 EMPTY ARRAY ON ERROR.
d.EMPTY ARRAY ON ERROR - 返回空数组 ([])
e.EMPTY OBJECT ON ERROR - 返回空对象 ({})
{ERROR|NULL|EMPTY|EMPTY ARRAY|EMPTY OBJECT|DEFAULT expression } ON EMPTY:指定没有结果相匹配时的返回值。
a.NULL ON EMPTY - 返回NULL,此为默认选项
b.ERROR ON EMPTY - 报错
c.EMPTY ON EMPTY - 等价于 EMPTY ARRAY ON ERROR.
d.EMPTY ARRAY ON EMPTY - 返回空数组 ([])
e.EMPTY OBJECT ON EMPTY - 返回空对象 ({})
示例:
-- JSON_basic_path_expression支持部分函数的使用(size,type,double,ceiling,floor,abs)
demo=# select json_query('[1,2,3,4,5]'::jsonb,'$.size()') ;
json_query
------------
5
(1 行记录)
demo=# select json_query(' {"a":1,"b":"bcol","c":"cc"}'::jsonb,'$.b.type()') ;
json_query
------------
"string"
(1 行记录)
demo=# select json_query(' {"a":-1,"b":"bcol","c":"cc"}'::jsonb,'$.a.abs()') ;
json_query
------------
1
(1 行记录)
-- JSON_basic_path_expression数组数据检索
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a');
json_query
-----------------
[1, 2, 3, 4, 5]
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[2]');
json_query
------------
3
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a.size()');
json_query
------------
5
(1 行记录)
-- JSON_basic_path_expression 数据筛选,只能返回一条数据,多条数据返回空值
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[*] ? ( @ > 4)');
json_query
------------
5
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[*] ? ( @ > 3)');
json_query
------------
(1 行记录)
-- 通过passing传递参数
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[*] ? ( @ > $x)' passing 4 as x);
json_query
------------
5
(1 行记录)
-- 通过returning返回值类型,并设置是否使用方括号“[]”包围(WITH WRAPPER)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[*] ? ( @ > 4)' returning text);
json_query
------------
5
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.a[*] ? ( @ > 4)' returning text WITH WRAPPER);
json_query
------------
[5]
(1 行记录)
-- 指定当返回值为字符串时是否保留双引号(“”).
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.c.e' KEEP QUOTES);
json_query
------------
"ab c"
(1 行记录)
-- 指定错误发生时的返回值。
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.c.e' returning int null on error);
json_query
------------
(1 行记录)
-- 指定没有结果相匹配时的返回值
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.c.f' EMPTY ARRAY ON EMPTY);
json_query
------------
[]
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.c.f' EMPTY OBJECT ON EMPTY);
json_query
------------
{}
(1 行记录)
demo=# select json_query('{"a": [1, 2, 3, 4, 5], "b": ["2", "a b"], "c": {"d": 4, "e": "ab c"}}'::jsonb,'$.c.f' returning text DEFAULT 'emp' on empty);
json_query
------------
emp
(1 行记录)
KingbaseES Json 系列五--Json数据操作函数三的更多相关文章
- Jq_Ajax 操作函数跟JQuery 遍历函数跟JQuery数据操作函数
JQuery文档操作方法 jQuery 库拥有完整的 Ajax 兼容套件.其中的函数和方法允许我们在不刷新浏览器的情况下从服务器加载数据. 函数 ...
- 【summary】JQuery 相关css、ajax、数据操作函数或方法
总结一下JQuery常用的函数方法,更加系统的整理一下. JQuery遍历的一些函数: 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集 ...
- SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型
原文:SQL Server 2008空间数据应用系列五:数据表中使用空间数据类型 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测 ...
- Python股票分析系列——基础股票数据操作(一).p3
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第3部分.在本教程中,我们将使用我们的股票数据进一步分解一些基本的数据操作和可视化.我们将要使用 ...
- ORACLE链接SQLSERVER数据库数据操作函数范例
ORACLE链接SQLSERVER数据库数据操作函数范例 create or replace function FUN_NAME(LS_DJBH IN varchar2 ,LS_ITM varchar ...
- Python股票分析系列——基础股票数据操作(二).p4
该系列视频已经搬运至bilibili: 点击查看 欢迎来到Python for Finance教程系列的第4部分.在本教程中,我们将基于Adj Close列创建烛台/ OHLC图,这将允许我介绍重新采 ...
- 每天十分钟系列:JS数据操作之神奇的map()
Array.prototype.map() map()方法可以创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后返回的结果. demo1 上面的例子,在控制台中打印的结果是: 1 2 3 ...
- jQuery 数据操作函数(九)
.clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() 从队列最前 ...
- jQuery 数据操作函数
函数 描述 .clearQueue() 从队列中删除所有未运行的项目. .data() 存储与匹配元素相关的任意数据. jQuery.data() 存储与指定元素相关的任意数据. .dequeue() ...
- docker系列五之数据卷(volumn)
docker数据卷(volumn) 一. 为什么需要数据卷 docker镜像是由多个文件系统(只读层)叠加而成,当我们启动一个容器的时候,docker的服务端会加载镜像的只读层,并在最顶层创建一个可读 ...
随机推荐
- EXPLAIN命令
EXPLAIN命令 除了以SELECT开头的查询语句,其余的DELETE.INSERT.REPLACE以及UPDATE语句前边都可以加上EXPLAIN这个词儿,用来查看这些语句的执行计划 Ty ...
- Redis原理再学习02:数据结构-动态字符串sds
Redis原理再学习:动态字符串sds 字符 字符就是英文里的一个一个英文字母,比如:a.中文里的单个汉字,比如:好. 字符串就是多个字母或多个汉字组成,比如字符串:redis,中文字符串:你好吗. ...
- 学习go语言编程之网络编程
Socket编程 Golang语言标准库对Socket编程进行了抽象,无论使用什么协议建立什么形式的连接,都只需要调用net.Dial()即可. Dial()函数 Dial()函数的原型如下: fun ...
- 记一次 splice 导致 io.Copy 阻塞的排查过程
记一次 splice 导致 io.Copy 阻塞的排查过程 简而言之,net.TCPConn 的 ReadFrom 零拷贝实现 splice 在 1.21.0 - 1.21.4 删除了 SPLICE_ ...
- os.path.relpath和os.path.basename,返回文件路径中的文件名
from os import path print(path.relpath("/home/hpcadmin/lw/demo.py", start="/home/hpca ...
- Navicat 12连接mysql8.x报错2059 - authentication plugin 'caching_sha2_password' 解决办法
// %表示远程连接允许所有ip,如果只是连接本地,将%改为localhost即可 ALTER USER 'root'@'%' IDENTIFIED BY '你自己的mysql的密码' PASSWOR ...
- ioutil.ReadDir读取目录下的内容
func dirents(dir string) []os.FileInfo{ entries, err := ioutil.ReadDir(dir) // 读取目录并返回排好序的文件以及子目录名 i ...
- 记一个 Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 编译问题引发的案例
某天将项目 kotlin 版本升级到了 1.8.0 ,然后编译报错了, Duplicate class kotlin-stblib vs kotlin-stdlib-jdk7/8 然后开始寻求解决方案 ...
- 最经典的TCP性能问题
目录 问题描述 问题的原因 什么是delay ack 什么是Nagle算法 如果client启用Nagle,并且server端启用了delay ack会有什么后果呢? 再来看一个经典例子和数据分析 回 ...
- NodeJS本地公用类库
git + npm link 先来看一下npm install 文档. npm 支持安装 git 仓库,支持 git , git+ssh , git+http , git+https , or git ...