我们正在创建标记名和各自标签值的json:
[
"name": "bob",
"surname": "dylan",
...
]这是通过首先创建一个主select,然后通过包含数十个nvl2函数来调用适当的过程来获取每个标记的值来完成的:
select u_json_pck.JsonPropertyObject(null,
nclob_tt(
nvl2(ExecuteSelectToCheckIfValueExists(),
U_JSON_PCK.JsonProperty('TAG_NAME', ExecuteAVerySimilarSelectToGetValue()),
decode(v_remove_empty_tags, 1,
U_JSON_PCK.JsonProperty('TAG_NAME', ''), null)),
nvl2(......),
nvl2(...)...(1)检查是否存在任何值(例如,对于标签"meetingParticipants“,可能没有参与者存在)
(2)如果存在,则调用实际获取该值的过程并将其形成必要的nclob,如果该值不存在,则将该值和标签添加到json (3),然后检查是否应该向json添加空标签,然后添加空标签或不添加空标签
是否可以对其进行重构,使ExecuteSelectToCheckIfValueExists()根本不被调用?我们可以在ExecuteAVerySimilarSelectToGetValue()中检查v_remove_empty_tags,然后,如果此函数没有找到任何结果,则返回-1或null。但是如何从这个结果中形成合适的json呢?
发布于 2021-09-10 14:13:26
我不知道您的函数u_json_pck和类型nclob_tt到底是做什么的,但是为什么不使用内置的JSON语法来做这件事呢?
select json_object
( 'myobject' value json_arrayagg
( json_object
( 'tag_name1' value value1
, 'tag_name2' value value2
, 'tag_name3' value value3
absent on null
)
returning clob
)
) json_data
from
( select null value1, 'BBB' value2, 'CCC' value3 from dual
union all
select null value1, 'BBB' value2, null value3 from dual
union all
select 123 value1, null value2, 'DDD' value3 from dual
union all
select 456 value1, 'EEE' value2, null value3 from dual
);它返回:
{
"myobject": [
{
"tag_name2": "BBB",
"tag_name3": "CCC"
},
{
"tag_name2": "BBB"
},
{
"tag_name1": 123,
"tag_name3": "DDD"
},
{
"tag_name1": 456,
"tag_name2": "EEE"
}
]
}您只需根据SQL值将absent on null更改为null on null -因此,要么为每个v_remove_empty_tags创建单独的select语句,要么动态构造SQL语句来指定它。
https://stackoverflow.com/questions/69132772
复制相似问题