大佬教程收集整理的这篇文章主要介绍了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_substr
、connect 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 |
db
在对 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,请注明来意。