Oracle 对 Json 数据进行增删改

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(4000),如果不指定返回 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 t.JSON_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
复制代码