程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Oracle 12c Json 拆分大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决Oracle 12c Json 拆分?

开发过程中遇到Oracle 12c Json 拆分的问题如何解决?下面主要结合日常开发的经验,给出你关于Oracle 12c Json 拆分的解决方法建议,希望对你解决Oracle 12c Json 拆分有所启发或帮助;

这就是我在 Oracle 12C 中获得结果的方式

ID 开始日期范围 结束日期范围
1 [ "2019-01-07","2019-02-17","2019-03-17"] [ "2019-01-14","2019-02-21","2019-03-21"]

我想要

ID 开始日期范围 结束日期范围
1 2019-01-07 2019-01-14
1 2019-02-17 2019-02-21
1 2019-03-17 2019-03-21

之前我问过这个关于单列拆分的问题,下面是链接 How to replace special characters and then break line In Oracle 但是当我添加另一列时,就会出现笛卡尔积。

解决方法

您可以使用 json_table 从 JSON 数组中提取字符串,大概是实际日期:

SELEct t.id,s.n,s.start_date,e.END_DATE
from your_table t
cross apply json_table (
  t.start_range,'$[*]'
  columns
    n for ordinality,start_date date path '$'
) s
join json_table (
  t.end_range,'$[*]' 
  columns
    n for ordinality,END_DATE date path '$'
) e
on e.n = s.n

for ordinality 子句提供每个数组的索引,然后连接匹配“相关”数组条目。

ID |  N | START_DATE | END_DATE 
-: | -: | :--------- | :--------
 1 |  1 | 07-JAN-19  | 14-JAN-19
 1 |  2 | 17-FEB-19  | 21-FEB-19
 1 |  3 | 17-MAR-19  | 21-MAR-19

如果您出于某种原因想要字符串而不是日期,您可以更改列子句中的数据类型。

db<>fiddle

,

在用空格替换 regexp_substrconnect by[ 后,您也可以使用 ]" 来实现。

架构和插入语句:

 create table testtable(Id int,Start_Date_Range varchar(500),END_DATE_Range varchar(500));

 insert into testtable values(1,'[ "2019-01-07","2019-02-17","2019-03-17"]','[ "2019-01-14","2019-02-21","2019-03-21"]');

查询:

 SELEct disTinct id,trim(regexp_substr(replace(replace(replace(Start_Date_Range,'"',''),'[',']','[^,]+',1,level) ) Start_Date_Range,trim(regexp_substr(replace(replace(replace(END_DATE_Range,level) ) END_DATE_Range,level
   from testtable
    connect by regexp_substr(Start_Date_Range,level) is not null
    order by id,level;

输出:

ID START_DATE_RANGE END_DATE_RANGE LEVEL
1 2019-01-07 2019-01-14 1
1 2019-02-17 2019-02-21 2
1 2019-03-17 2019-03-21 3

dbhere

,

在对 OP 的评论中,我指出数据模型不太正确。两个JSON数组中的值是相关的;此类数据应编码在单个对象中,而不是两个。应该有一个对象数组,每个对象有两个成员:开始日期和结束日期。

为了说明我建议的数据模型,我从一个示例输入表(带有附加 id)开始,我完全使用 Alex Poole 的答案来生成 OP 询问的表,但随后我使用了 JSON生成函数将数据放回 JSON 格式,以说明我认为输入数据应该是什么样子。 (JSON 字符串的提供者应该以这种格式创建一个 JSON,而不是发送两个单独的 JSON 字符串数组来表示日期)。

我在这里没有展示的是如何使用对 JSON_TABLE 的单个调用从查询结束时创建的单个对象数组中拆分数据。这比从两个单独的 JSON 数组中获取数据的查询要简单得多。

注意 - 这不是真正的答案;我写它作为答案,因为它显然不适合评论。

with
  t (id,start_date_range,END_DATE_rangE) as (
    SELEct 1,'["2019-01-07",'["2019-01-14","2019-03-21"]' from dual union all
    SELEct 5,'["2020-04-23","2020-06-15"]','["2020-04-30","2020-06-19"]'              from dual
  ),shown_as_table(id,n,start_date,END_DATE) as (
    SELEct t.id,TO_CHAR(s.start_date,'yyyy-mm-dd'),TO_CHAR(e.END_DATE,'yyyy-mm-dd')
    from t
    cross apply json_table (
      t.start_date_range,'$[*]'
      columns
        n for ordinality,start_date date path '$'
    ) s
    join json_table (
      t.END_DATE_range,'$[*]' 
      columns
        n for ordinality,END_DATE date path '$'
    ) e
    on e.n = s.n
  )
SELEct id,json_arrayagg(
                json_object('start' value start_date,'end' value END_DATE)
                format json
                order by n
           ) as date_range_array
from   shown_as_table
group  by id
;

输出:

ID DATE_RANGE_ARRAY                                                                                                               
-- -------------------------------------------------------------------------------------------------------------------------------
 1 [{"start":"2019-01-07","end":"2019-01-14"},{"start":"2019-02-17","end":"2019-02-21"},{"start":"2019-03-17","end":"2019-03-21"}]                                 
 5 [{"start":"2020-04-23","end":"2020-04-30"},{"start":"2020-06-15","end":"2020-06-19"}]

大佬总结

以上是大佬教程为你收集整理的Oracle 12c Json 拆分全部内容,希望文章能够帮你解决Oracle 12c Json 拆分所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:12c拆分