Oracle 12c Json拆分

mzaanser  于 2023-07-01  发布在  Oracle
关注(0)|答案(4)|浏览(192)

这就是我在Oracle 12 c中获得结果的方式
| 开始日期范围|结束日期范围| End Date Range |
| --|--| ------------ |
| [“2019-01-07”,“2019-02-17”,“2019-03-17”]|[“2019-01-14”,“2019-02-21”,“2019-03-21”]| [ "2019-01-14","2019-02-21","2019-03-21"] |
我想要
| 开始日期范围|结束日期范围| End Date Range |
| --|--| ------------ |
| 2019-01-07| 2019-01-14 2019-01-14| 2019-01-14 |
| 2019-02-17 2019-02-17| 2019-02-21 2019-02-21| 2019-02-21 |
| 2019-03-17 2019-03-17| 2019-03-21 2019-03-21| 2019-03-21 |
早些时候我问过这个问题的单列分裂和下面的链接如何取代特殊字符,然后打破行在甲骨文但当我添加另一列有笛卡尔积。

vcirk6k6

vcirk6k61#

您可以使用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

如果出于某种原因需要字符串而不是日期,则可以在column子句中更改数据类型。
db<>fiddle

vaqhlq81

vaqhlq812#

您也可以在将[]"替换为空格后,使用regexp_substrconnect by执行此操作。
Schema和insert语句:

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,'"',''),'[',''),']',''),'[^,]+', 1, level) ) End_Date_Range,
  level
   from testtable
    connect by regexp_substr(Start_Date_Range, '[^,]+', 1, level) is not null
    order by id, level;

输出:
| 开始日期范围|结束日期范围|水平| LEVEL |
| --|--|--| ------------ |
| 2019-01-07| 2019-01-14 2019-01-14| 1| 1 |
| 2019-02-17 2019-02-17| 2019-02-21 2019-02-21| 2| 2 |
| 2019-03-17 2019-03-17| 2019-03-21 2019-03-21| 3| 3 |

00jrzges

00jrzges3#

在对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-02-17","2019-03-17"]',
              '["2019-01-14","2019-02-21","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, s.n, 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"}]
vhipe2zx

vhipe2zx4#

谢谢..我实际上有JSON格式的最后输出。我如何从那后面得到匹配的开始和结束日期?

相关问题