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