sql - 如何重构通过nvl2向json添加属性以避免重复?
问题描述
我们正在创建标签名称和相应标签值的 json:
[
"name": "bob",
"surname": "dylan",
...
]
这是通过首先创建一个主选择来完成的,然后通过包含数十个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 的过程,并添加这个和tag 到 json (3) 如果它不存在,然后检查是否应该在 json 中添加空标签,然后添加一个空标签或不添加一个
可以重构它以便ExecuteSelectToCheckIfValueExists()
根本不调用它吗?我们可以检查然后,如果这个函数没有找到结果,v_remove_empty_tags
返回或。但是如何从该结果中形成适当的 json 呢?ExecuteAVerySimilarSelectToGetValue()
-1
null
解决方案
我不知道你的函数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"
}
]
}
您只需要根据 - 的值进行更改absent on null
,因此要么为每个单独的语句,要么动态构造 SQL 来指定它。null on null
v_remove_empty_tags
select
推荐阅读
- python - The difference of loading model parameters between load_state_dict and nn.Parameter in pytorch
- go - Error get all list items deleted_at is not null
- hybris - Promoting items on Adaptive Search not working Hybris
- node.js - 上传到 S3 的图像已损坏
- python - 如何正确设置此线程套接字读取?
- integration-testing - 使用无服务器离线和集成测试进行模拟
- javascript - 与 Webpack 一起使用的 Vue 从 DOM 中删除应用程序根
- c++ - C++ 查找/子字符串错误
- c++ - 可以从具有相同名称的派生类函数调用基类函数。但我找不到支持这一点的标准报价
- css - PrimeVue 菜单栏