Oracle 19c处理JSON时如何剔除common对象内的zona、central子节点
Oracle JSON提取时排除指定子节点实现方案
针对从common对象中剔除zona、central字段的需求,根据Oracle版本不同可选择两种实现方式:
方案1:兼容所有支持JSON函数的Oracle版本(12cR2及以上)
直接逐字段构建需要保留的内容,不需要的字段不写入即可,完全可控:
SELECT JSON_OBJECT ( 'Type' VALUE TO_CHAR(a.Type), 'Color' VALUE TO_CHAR(a.Color), 'App' VALUE TO_CHAR(a.App), 'Amount' VALUE TO_CHAR(a.Amount), 'my_json' VALUE JSON_OBJECT( 'contrato' VALUE JSON_QUERY(a.col, '$.common.contrato' WITHOUT WRAPPER RETURNING JSON), 'servicio' VALUE JSON_VALUE(a.col, '$.common.servicio'), 'actividad' VALUE JSON_VALUE(a.col, '$.common.actividad'), 'tipo_actividad' VALUE JSON_VALUE(a.col, '$.common.tipo_actividad'), 'numero_administrativo' VALUE JSON_VALUE(a.col, '$.common.numero_administrativo'), 'estado_origen' VALUE JSON_VALUE(a.col, '$.common.estado_origen'), 'provincia' VALUE JSON_QUERY(a.col, '$.common.provincia' WITHOUT WRAPPER RETURNING JSON), 'aplicacion_origen' VALUE JSON_QUERY(a.col, '$.common.aplicacion_origen' WITHOUT WRAPPER RETURNING JSON), 'clave' VALUE JSON_QUERY(a.col, '$.common.clave' WITHOUT WRAPPER RETURNING JSON) ) RETURNING JSON ) AS final_json FROM FB_TAB a WHERE a.id = :id;
方案2:高版本Oracle(21c及以上)直接使用排除语法
无需逐字段列举需要保留的内容,直接指定要剔除的路径,适合common下字段较多的场景:
SELECT JSON_OBJECT ( 'Type' VALUE TO_CHAR(a.Type), 'Color' VALUE TO_CHAR(a.Color), 'App' VALUE TO_CHAR(a.App), 'Amount' VALUE TO_CHAR(a.Amount), 'my_json' VALUE JSON_QUERY( a.col, '$.common' EXCLUDE '$.common.zona' '$.common.central' WITHOUT WRAPPER RETURNING JSON ) ) AS final_json FROM FB_TAB a WHERE a.id = :id;
关键说明
- 嵌套对象类型的字段(如
contrato、provincia)必须用JSON_QUERY并指定RETURNING JSON,否则会被解析为字符串导致结构错误。 - 原有语句中的
TREAT(... AS JSON)可替换为RETURNING JSON子句,写法更规范,兼容性更好。 - 若需新增/删除保留字段,方案1只需调整
my_json内部的字段列表,方案2只需增减EXCLUDE后的路径即可。
内容的提问来源于stack exchange,提问作者Julio
相关产品推荐
相关产品推荐

