Oracle 对 Json 数据进行增删改

news/2025/3/17 11:07:34/文章来源:https://www.cnblogs.com/learcher/p/18776329

1、背景:

由于项目要求,需要对大型的 Json 数据入库到DB中(clob 类型),由于内容过长或者 oracle 版本限制,有一些熟知的处理方法是不能使用的。

精确解决问题,可以直接看第四步:【4、对应的栗子 SQL:】,其他都是废话。

 

2、结构:

原始数据:

'{"name": "李四", "skillLevel":{"项目经理": "高级","技术经理": "高级","产品经理": "高级"}}'

 

3、目标:

3.1、将 “李四” 修改为 “李四大佬” 【修改一级 value】

3.2、将 “项目经理” 的 “高级” 修改为 “超高级” 【修改二级 value】

3.3、删除属性 “技术经理”  【删除 key】

3.4、“产品经理” 不做任何修改 【不动】

3.5、新增属性 “技术总监” ,级别是 “超高级”  【新增 key-value】

效果对照4里面的 SQL 即可,我就不拆开单条 SQL 了。

 

4、对应的栗子 SQL:

SELECT JSON_MERGEPATCH('{"name": "李四", "skillLevel":{"项目经理": "高级","技术经理": "高级","产品经理": "高级"}}', '{"name": "李四大佬", "skillLevel":{"项目经理": "超高级","技术经理": null, "技术总监": "超高级"}}'RETURNING CLOB PRETTY) AS text 
FROM dual t

 

5、JSON_MERGEPATCH 函数解释

添加 RETURNING CLOB PRETTY 是因为我的 Json_data 超大(超过了 varchar2),如果不指定返回 clob 类型,它就会无法处理,会返回 NULL。

注意:只有两个入参,第二个入参后面跟的是指定类型

JSON_MERGEPATCH(json_data, update_json_date [RETURNING CLOB PRETTY])

 

6、实际应用

把 李四 的信息修改

UPDATE T.JSON_DATA =  JSON_MERGEPATCH(T.JSON_DATA, '{"name": "李四大佬", "skillLevel":{"项目经理": "超高级","技术经理": null, "技术总监": "超高级"}}'RETURNING CLOB PRETTY) 
FROM JSON_DATA_TABLE t 
WHERE tJSON_EXISTS(t.JSON_DATA, '$.name ? (@ == "李四")');

 

7、其他函数解释

-- JSON_QUERY 查询对象,如果查询的属性不是对象,则返回 NULL
SELECT JSON_QUERY('{"common": {"sex": { "M": "男", "F": "女", "U": "不詳" }}}', '$.common.sex') as sexLabel FROM DUAL;-- JSON_VALUE 查询字段,如果查询的属性是对象,则返回 NULL
SELECT JSON_VALUE('{"common": {"sex": { "M": "男", "F": "女", "U": "不詳" }}}', '$.common.sex.M') as sexLabel FROM DUAL;-- JSON_EXISTS 判断属性或者值是否存在
SELECT 1 FROM DUAL WHERE JSON_EXISTS('{"common": {"sex": { "M": "男", "F": "女" }}}', '$.common.sex.M');
SELECT 1 FROM DUAL WHERE JSON_EXISTS('{"common": {"sex": { "M": "男", "F": "女" }}}', '$.common.sex.M ? (@ == "男")');-- JSON_MERGEPATCH 合并两个对象,将第二个参数的存在的属性替换掉第一个 JSON 对象的属性;
SELECT JSON_MERGEPATCH('{"common": {"sex": { "M": "男", "F": "女" }}}', '{"common": {"sex": { "M": "男1", "F": "女" }}}') as sex FROM DUAL;-- 如果 JSON_MERGEPATCH 的返回值超大,则需要指定返回类型:
SELECT JSON_MERGEPATCH(TO_CLOB('{"common": {"sex": { "M": "男", "F": "女" }}}'), '{"common": {"sex": { "M": "男1", "F": "女" }}}' RETURNING CLOB PRETTY ) as sex FROM DUAL;--JSON_TABLE 将 JSON 数据转为表结构显示 JSON_OBJECT 生成一个 JSON 对象 JSON_ARRAY 生成一个 JSON 数组 -- 找不到方法 
-- JSON_MERGEPRESERVE 修改数据使用
-- JSON_MODIFY 修改数据使用
-- JSON_KEYS 获取所有的 keys
-- JSON_REMOVE 删除某个 key

 


 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

011 App宽高铺满和Element-Plus的CS

1、让app的盒子沾满屏幕 首先我们给app一个底色 可以看到并没有占满 可以看到app在这个盒子里面 所以应该先让这个盒子占满 方法一:(应为需要改index.html,不推荐,但是可以看一下) 可以看到 方法二(推荐) 这段代码,用来设置元素的尺寸:width: 100vw;:width表示元素…

5. 创建一个栅栏布局组件-DeepSeek辅助编程

在deepseek中输入:创建一个vue组件 组件实现栅栏布局的功能 deepseek返回的代码: Row.vue<template><div class="grid-row":style="rowStyle":class="rowClass"><slot></slot></div> </template><scri…

突破卡脖子工程:6大信创项目管理平台横向测评

随着信息技术的快速发展,信创项目管理平台在推动我国信息技术创新和产业发展方面发挥着重要作用。为了帮助读者更好地了解和选择适合的信创项目管理平台,本文对 6 大信创项目管理平台进行了横向测评。 禅道——信创国产化项目管理解决方案 禅道是一款国产的项目管理软件,禅道…

夜莺监控如何对接飞书、飞书卡片发送告警

新版通知规则的介绍文章:夜莺监控巨大革新:抽象出通知规则,增强告警通知的灵活性 新版通知规则对接钉钉:夜莺监控 v8.0 新版通知规则 | 对接钉钉告警 新版通知规则对接企微:夜莺监控 v8.0 新版通知规则 | 对接企微告警本文对背景信息不做额外描述了,大家一定要先看看上面…

网络攻防实验三

1.实验内容 (1)动手实践tcpdump 使用tcpdump开源软件对在本机上访问www.tianya.cn网站过程进行嗅探,回答问题:你在访问www.tianya.cn网站首页时,浏览器将访问多少个Web服务器?他们的IP地址都是什么? (2)动手实践Wireshark 使用Wireshark开源软件对在本机上以TELNET方式…

Debian:apt-get命令汇总

apt-get命令 是Debian Linux发行版中的APT软件包管理工具。所有基于Debian的发行(常见的 10 个基于 Debian 的 Linux 发行版)都使用这个包管理系统。deb包可以把一个应用的文件包在一起,大体就如同Windows上的安装文件。语法 apt-get [OPTION] PACKAGE 选项 apt-get install…

Edge浏览器的设备仿真模式下显示鼠标指针

在使用Edge浏览器进行网页开发时,设备仿真模式是一个非常有用的工具,它可以帮助开发者模拟不同设备上的用户体验。但在设备仿真模式下,鼠标指针会显示为一个圆形触摸指示器,而不是我们熟悉的鼠标箭头,这可能会对精确测试鼠标交互造成影响。 改变方法 在设备仿真工具栏中,…

openmanus 代码分析 #2 - agent classes

根据你提供的 agent 目录下各个类的信息,下面是对应的 PlantUML 代码,用于绘制类图展示这些类之间的关系:@startuml定义抽象基类 abstract class BaseAgent {+ name: str+ description: Optional[str]+ system_prompt: Optional[str]+ next_step_prompt: Optional[str]+ l…

实践四:数据模型与数据库

实践四:数据模型与数据库 内容概述:本节课我们将引入数据模型(model),通过创建数据模型和数据表,我们就可以将信息存储在数据库中,并将数据库中的信息呈现在页面上。 1. 在完成实践一、实践二、实践三的基础上开始本项目,进入激活虚拟环境。pipenv shel提示:接下来我们…

clickhouse 开启认证 SQL 方式

ClickHouse 访问控制 RBAC 用户账户:包含身份信息、权限、允许的主机、角色和设置。 角色:权限容器,可分配给用户或其他角色。 行策略:定义表中行的可见性。 设置配置文件:集中管理用户/角色的配置参数。 配额:限制资源使用(如查询次数、内存)。 权限层级 权限按层级划…

No.66 Vue---Vue引入路由配置、路由传递参数、嵌套路由配置

一、Vue引入路由配置在Vue中,我们可以通过 vue-router 路由管理页面之间的关系 Vue Router 是 Vue.js 的官方路由。它与 Vue.js 核心深度集成,让用 Vue.js 构建单页应用变得轻而易举.1.1 在vue中引入路由 第一步:安装路由npm install -save vue-router第二步:配置独立的路由…

开源!Django-Vue3-Admin的Python后台管理系统

DjangoAdmin 是一个基于 Django + Vue3 的前后端分离的后台管理系统,采用了最新的前后端技术栈,内置了丰富的功能模块,可以帮助开发者快速搭建企业级中后台产品。Django-Vue3-Admin 项目简介 Django-Vue3-Admin 是一个基于 Django + Vue3 的前后端分离的后台管理系统,采用了…