首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何通过nvl2重构向json添加属性以避免重复?

问如何通过nvl2重构向json添加属性以避免重复?
EN

Stack Overflow用户
提问于 2021-09-10 13:13:10
回答 1查看 19关注 0票数 0

我们正在创建标记名和各自标签值的json:

代码语言:javascript
复制
[
  "name": "bob",
  "surname": "dylan",
  ...
]

这是通过首先创建一个主select,然后通过包含数十个nvl2函数来调用适当的过程来获取每个标记的值来完成的:

代码语言:javascript
复制
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呢?

EN

回答 1

Stack Overflow用户

发布于 2021-09-10 14:13:26

我不知道您的函数u_json_pck和类型nclob_tt到底是做什么的,但是为什么不使用内置的JSON语法来做这件事呢?

代码语言:javascript
复制
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
  );

它返回:

代码语言:javascript
复制
{
  "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语句来指定它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69132772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档