Oracle 处理json数据

news2024/11/27 16:41:59

文章目录

  • 备注:
  • 一. Json数据存储
  • 二. Json数据insert
  • 三. json数据update
  • 四. json数据查询
  • 五. 常用的json函数
    • 5.1 json_array
    • 5.2 JSON_ARRAYAGG
    • 5.3 JSON_DATAGUIDE
    • 5.4 JSON_MERGEPATCH
    • 5.5 JSON_OBJECT
    • 5.6 JSON_OBJECTAGG
    • 5.7 JSON_QUERY
    • 5.8 json_serialize
    • 5.9 JSON_TABLE
    • 5.10 JSON_TRANSFORM
    • 5.11 JSON_VALUE
  • 参考:

备注:

Oracle 19C

一. Json数据存储

看了下官网,Json数据一般使用varchar2(400),varchar2(32676)或者BLOB来存储Json数据。
代码:

create table test_json(id number,json_text varchar2(4000) CONSTRAINT ensure_json CHECK (json_text IS JSON));

二. Json数据insert

数据准备:


insert into test_json
select rownum as rn,
       json_text
 from 
 (
select json_object(
         'deptno' value d.deptno,
         'dname' value d.dname,
         'loc' value d.loc,
         'emps' value json_arrayagg ( 
            json_object(
                'empno' value e.empno,
                'ename' value e.ename,
                'job'   value e.job,
                'mgr'   value e.mgr,
                'hiredate' value e.hiredate,
                'sal' value e.sal,
                'comm' value e.comm
             ) 
            )
        )  as json_text
  from dept d
  left join emp e
  on d.deptno = e.deptno
  group by d.deptno,d.dname,d.loc
  ) tmp
  ;

*查看json数据:
deptno为40的没有员工,也都进入了,这个看起来有点奇怪
image.png
我们看看deptno为10的json数据
image.png

三. json数据update

上一步 deptno为40的没有员工,也都进入了,这个看起来有点奇怪 ,我需要emps后面的都去除掉。

代码:

UPDATE TEST_JSON SET json_text =
  json_mergepatch(json_text, '{"deptno":40,"dname":"OPERATIONS","loc":"BOSTON","emps" : null}')
 where id = 4 
  ;

测试记录:
image.png

四. json数据查询

上一个步骤中,我们插入的部门数据,每个部门都有0或多个员工,此时我们显示部门名称,以及部门下所有的员工。

代码:

select t.id,
       t.json_text.dname,
       t.json_text.emps.ename
 from TEST_JSON t
 ;

测试记录:
不得不说,Oracle的json功能真的太方便了
image.png

代码2:

select t.id,
       JSON_QUERY(t.json_text, '$.emps.ename' WITH WRAPPER)
 from TEST_JSON t
 ;

测试记录2:
image.png

五. 常用的json函数

5.1 json_array

如果json中要存数组的话,可以使用json_array函数

SQL> select JSON_ARRAY(1,2,3) from dual;
JSON_ARRAY(1,2,3)
--------------------------------------------------------------------------------
[1,2,3]

5.2 JSON_ARRAYAGG

将多列数据转换为一个数组类型,例如第二步insert的时候就有使用JSON_ARRAYAGG函数。

代码:

insert into test_json
select rownum as rn,
       json_text
 from 
 (
select json_object(
         'deptno' value d.deptno,
         'dname' value d.dname,
         'loc' value d.loc,
         'emps' value json_arrayagg ( 
            json_object(
                'empno' value e.empno,
                'ename' value e.ename,
                'job'   value e.job,
                'mgr'   value e.mgr,
                'hiredate' value e.hiredate,
                'sal' value e.sal,
                'comm' value e.comm
             ) 
            )
        )  as json_text
  from dept d
  left join emp e
  on d.deptno = e.deptno
  group by d.deptno,d.dname,d.loc
  ) tmp
  ;

官网测试demo:

CREATE TABLE id_table (id NUMBER);
INSERT INTO id_table VALUES(624);
INSERT INTO id_table VALUES(null);
INSERT INTO id_table VALUES(925);
INSERT INTO id_table VALUES(585);
SELECT JSON_ARRAYAGG(id ORDER BY id RETURNING VARCHAR2(100)) ID_NUMBERS
  FROM id_table;

官网测试demo:

SQL> CREATE TABLE id_table (id NUMBER);
Table created
SQL> INSERT INTO id_table VALUES(624);
1 row inserted
SQL> INSERT INTO id_table VALUES(null);
1 row inserted
SQL> INSERT INTO id_table VALUES(925);
1 row inserted
SQL> INSERT INTO id_table VALUES(585);
1 row inserted

SQL> 
SQL> SELECT JSON_ARRAYAGG(id ORDER BY id RETURNING VARCHAR2(100)) ID_NUMBERS
  2    FROM id_table;
ID_NUMBERS
--------------------------------------------------------------------------------
[585,624,925]

SQL> 

5.3 JSON_DATAGUIDE

聚合函数JSON_DATAGUIDE接受JSON数据的表列作为输入,并将数据指南作为CLOB返回。列中的每一行都被称为一个JSON文档。对于列中的每个JSON文档,该函数返回一个CLOB值,其中包含该JSON文档的平面数据指南。

代码:

select t.id,
       --t.json_text,
       JSON_DATAGUIDE(t.json_text)
 from TEST_JSON t
 group by t.id
 order by t.id
 ;

测试记录:
image.png

image.png

5.4 JSON_MERGEPATCH

用于update json文档数据
代码:

UPDATE TEST_JSON SET json_text =
  json_mergepatch(json_text, '{"deptno":40,"dname":"OPERATIONS","loc":"BOSTON","emps" : null}')
 where id = 4 
  ;

测试记录:
image.png

5.5 JSON_OBJECT

SQL/JSON函数JSON_OBJECT接受一系列键-值对或一个对象类型实例作为输入。集合类型不能传递给JSON_OBJECT。

代码:

select empno,
       JSON_OBJECT(key 'empno' value empno,
                   key 'ename' value ename,
                   key 'job' value job) as emp_json
  from emp;

测试记录:
image.png

5.6 JSON_OBJECTAGG

SQL/JSON函数JSON_OBJECTAGG是一个聚合函数。它将属性键-值对作为其输入。通常,属性键、属性值或两者都是SQL表达式的列。该函数为每个键-值对构造一个对象成员,并返回一个包含这些对象成员的JSON对象。

image.png

代码:

select JSON_OBJECTAGG(key dname value deptno) as depts
  from dept

测试记录:
image.png

5.7 JSON_QUERY

JSON_QUERY从JSON数据中选择并返回一个或多个值,然后返回这些值。可以使用JSON_QUERY检索JSON文档的片段。

image.png

代码:

select t.id,
       JSON_QUERY(t.json_text, '$.emps.ename' WITH WRAPPER)
 from TEST_JSON t
 ;

测试记录:
image.png

5.8 json_serialize

json_serialize函数接受任何SQL数据类型(VARCHAR2、CLOB、BLOB)的JSON数据作为输入,并返回其文本表示。通常使用它来转换查询的结果。

可以使用json_serialize将二进制JSON数据转换为文本形式(VARCHAR2或CLOB),或者通过对文本JSON数据进行精细打印或对其中的非ascii Unicode字符进行转义来转换文本JSON数据。

测试记录:

SQL> SELECT JSON_SERIALIZE ('{a:[1,2,3,4]}' RETURNING VARCHAR2(10) TRUNCATE ERROR ON ERROR) from dual;
JSON_SERIALIZE('{A:[1,2,3,4]}'
------------------------------
{"a":[1,2,

5.9 JSON_TABLE

SQL/JSON函数JSON_TABLE创建JSON数据的关系视图。它将JSON数据计算的结果映射到关系行和列中。可以使用SQL将函数返回的结果作为虚拟关系表进行查询。JSON_TABLE的主要目的是为JSON数组中的每个对象创建一行关系数据,并将该对象中的JSON值作为单独的SQL列值输出。

image.png

代码:

SELECT t.*
FROM test_json
NESTED json_text COLUMNS(dname, deptno) t;

测试记录:
image.png

代码2:

SELECT t.*
FROM test_json LEFT OUTER JOIN
JSON_TABLE(json_text COLUMNS(dname, deptno)) t ON 1=1;

测试记录2:
image.png

5.10 JSON_TRANSFORM

使用JSON_TRANSFORM修改JSON文档输入到函数中。通过指定一个或多个对JSON数据执行更改的修改操作,可以更改JSON文档(或JSON文档的部分)。修改后的JSON文档作为输出返回。

image.png

5.11 JSON_VALUE

SQL/JSON函数JSON_VALUE在JSON数据中查找指定的标量JSON值,并将其作为SQL值返回。

测试记录:

SQL> SELECT JSON_VALUE('{a:100}', '$.a') AS value
  2    FROM DUAL;
VALUE
--------------------------------------------------------------------------------
100

SQL> 

参考:

  1. https://docs.oracle.com/en/database/oracle/oracle-database/19/adjsn/json-in-oracle-database.html#GUID-A8A58B49-13A5-4F42-8EA0-508951DAE0BB
  2. https://docs.oracle.com/en/database/oracle/oracle-database/19/sqlrf/JSON_QUERY.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/3936.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

作为前端还在使用GIF动画吗?换一种更优雅的方案吧

Web-Editor 前言 动画需求在业务开发中是很常见的功能,无论是客户端开发、Web 开发、还是桌面端开发,为了产品有更好的用户体验,UED 设计的视觉效果也愈发的复杂,一般些简单的淡入淡出,旋转效果开发花费些时间即可搞…

三只松鼠,“跑”不动了?

【潮汐商业评论/ 原创】 编辑部的Lisa是个典型的吃货,而坚果零食绝对是她的心头好。用她的话来说“坚果提供优质脂肪,每天吃点,解馋又健康啊。” 而作为网红坚果零食“开山鼻祖”之一的三只松鼠,最近的日子似乎并不好过。 近日…

阿里云SLB之:基于HTTPS协议的SLB应用场景(十二)

文章目录 1.配置域名解析2.配置HTTPS协议类型的SLB七层负载2.1.点击监听配置向导2.2.配置负载均衡类型2.3.设置负载均衡算法2.4.设置域名使用的SSL证书2.5.设置后端虚拟服务器组2.6.开机健康检查2.7.审核配置完成创建3.配置HTTP强转HTTPS4.配置ECS中的Nginx支持HTTPS协议5.通过…

文件传输协议

1、FTP 文件传送协议FPT(File Transfer Protocol)是互联网上使用的最广泛的文件传输协议。FTP提供交互式访问,允许客户指明文件的类型与格式,并允许文件具有存取权限(如访问文件的用户必须经过授权,如输入有…

pg故障修复记录

一个线上实例,用户数据大概300g 400g的样子,由于用户自己修改了最大连接数,超过了我们设置的合理范围,导致自动恢复失败,现在需要我们手动搭建起来新的主从关系。 但是在搭建的过程中,出现了两个比较麻烦的…

我用python分析买房数据

首先说明,这是一篇技术文章。 明年打算买房,媳妇这段时间总去看房子,这种状态持续了两个月,最近终于消停了。现在整个市场不明朗,我们也不确定换到哪里。不如先整理点数据,至少能监控一些区域价格&#xf…

Vue利用flex布局实现TV端城市列表

Vue利用flex布局实现TV端城市列表 vue中城市列表和搜索很常见&#xff0c;这篇博客就来说说咋实现搜索和城市列表 1.实现搜索布局代码&#xff1a; <div class"search-bar"><input class"search-input" v-model"citySearchResult" :…

Java【数组】定义与使用,什么是引用类型你知道吗

文章目录前言一、数组的基本概念1.什么是数组2.数组的创建和初始化1.数组的创建2. 数组的初始化3.数组的使用4.遍历数组&#xff08;两种方式&#xff09;二、数组是引用类型1.初识JVM内存分配2.引用类型3.认识null三、数组的应用场景1.保存数据2.作为方法的参数1.参数传基本数…

STM32F407ZGT6|SPI主从模式

功能&#xff1a;主机发送数据0x34–>从机接收数据–>通过串口将数据发送出去–>串口猎人显示0x34 必备知识点 1、SPI串行外设接口特点 高速、全双工、同步、串行高速&#xff1a;发送数据的速度很快全双工&#xff1a;两设备可同时双向通信&#xff08;接收与发送&…

STM32 CAN过滤器标识符学习笔记

最近看了下STM32 CAN 通讯其中标示符过滤器设置大有讲究。特别是你要使用ST库函数时&#xff0c;当过滤器工作在屏蔽模式下&#xff0c;并且你把屏蔽位设了1也就是标示符对应位必须全部匹配才能通过&#xff0c;这是由其要小心。 举个例子吧&#xff0c;过滤器长度为32位&…

【MindSpore易点通】在开发环境中如何使用MindInsight在线调试器

背景信息 在使用开发环境训练任务过程中&#xff0c;为方便开发人员更形象地观察到实时训练任务中的数值变化情况以分析精度问题&#xff0c;ModelArts在线调节器应运而生。与离线调试器的区别在于&#xff0c;离线调试器只能待整个任务运行完成后&#xff08;收集到整个任务过…

【机器学习大杀器】Stacking堆叠模型

1.前言 Kaglle比赛中使用Stacking模型是非常常见的大杀器&#xff0c;这是为什么呢&#xff1f; 【机器学习大杀器】Stacking堆叠模型 1.前言 2.Model 3: Stacking model 2.1 description of the algorithms: 2.2 interpretation of the estimated models: 3. Extend 3.1 …

终于盼到了,Python 数据科学速查表中文版来了

近几年以来&#xff0c;Python 的应用场景越来越多&#xff0c;几乎可以应用于自然科学、工程技术、金融、通信和商业等各种领域。究其原因在于 Python 的简单易学、功能强大。 想系统地学点东西&#xff0c;发现很多不错的技术文档都是英文资料&#xff0c;发现英文竟然成为了…

数据结构考研第六章——图(内含动图)

大纲要求&#xff1a;图的相关算法相对较多&#xff0c;通常只要求掌握其基本思想和实现步骤&#xff0c;而算法的具体实现不是重点。 一、图的基本概念 图的概念&#xff1a;图G由顶点集V和边集E组成的&#xff0c;记为G&#xff08;V&#xff0c;E&#xff09;有向图&#x…

6_显示登录信息以及上传图片

目录一 显示登录信息二 账号设置修改用户图片一 显示登录信息 实现思路 书写一个拦截器 loginTicketInterceptor 在 preHandle 方法中获取用户发送请求时携带的 cookie书写一个专门获取cookie的工具类 CookieUtil查数据库,数据库是否存在该 ticket,判断该凭证是否有效,-凭证是…

【论文阅读】EDPLVO: Efficient Direct Point-Line Visual Odometry

一、公式及符号约定 这篇论文是将直接法的残差计算从点扩展到了线段&#xff0c;所以一些符号在第三章的部分提前做了约定。用Π表示投影的函数&#xff0c;也就是用像素坐标和内参矩阵以及深度信息&#xff0c;投影出点的空间坐标&#xff0c;反之Π-1表示的是将空间坐标投影…

Git使用详细教程

1. cmd面板的常用命令 clear&#xff1a;清屏cd 文件夹名称----进入文件夹cd … 进入上一级目录(两个点)dir 查看当前目录下的文件和文件夹(全拼:directory)Is 查看当前目录下的文件和文件夹touch 文件名----创建文件echo 内容 > 创建文件名----创建文件并写入内容rm 文件名…

基于udp实现回显服务器,翻译服务器

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 udp socket 要掌握的类&#xff1a; 1.DatagramSocket 2.DatagramPacket 一、udp版本回显服务器 服务端&#xff1a; 完整代码 客户端&#xff1a; 完整代码 udp版本翻译…

Spring注入和生命周期

目录 获取Bean对象&#xff08;对象装配&#xff09; 属性注入 构造注入 Setter注入 三种注入的优缺点分析 注入的注解&#xff1a; 一个类型多个bean对象的注入方式 1.让变量名等于bean的id 2.用Resource注解&#xff08;name“bean的id”&#xff09; 3.用Qualif…

Java 核心技术 0 —— Class加载 和 运行时数据区域

JVM 是 字节码的运行环境&#xff0c;负责装载class到JVM内部&#xff0c;解释编译为对应平台的机器码指令进行执行&#xff0c;对于JVM设计有权威的定义规范&#xff0c;了解 JVM 类加载各部的主要功能 和 运行时数据区域组成 很有意义。 磁盘上有一个.java文件&#xff0c;通…