如何解决从CLOB数据类型列生成Oracle JSON
要求是从clob数据类型列生成JSON。 环境版本Oracle 12.2
我有一个表,其中包含字段ID(数字数据类型)和详细信息(Clob类型),如下所示
ID - details
100 - 134332:10.0,1481422:1.976,1483734:1.688,2835036:1.371
101 - 134331:0.742,319892:0.734,1558987:0.7,2132090:0.697
例如输出:
{
"pId":100,"cid":[
{
"cId":134332,"wt":"10.0"
},{
"cId":1481422,"wt":"1.976"
},{
"cId":1483734,"wt":"1.688"
},{
"cId":2835036,"wt":"1.371"
}
]
}
请帮助使用oracle SQL查询生成输出。
解决方法
下面,我建立了一个表,其中包含一些用于测试的输入行;然后我展示一种解决问题的方法,以及该查询的输出。我没有尝试编写效率最高(最快)的查询。相反,我希望这会告诉您如何实现。然后,如果速度有问题,您可以进行解决。 (在那种情况下,最好先重新考虑输入,这样会破坏“第一范式”。)
我添加了几个输入行进行测试,以了解如何处理null
。您可以决定是否进行所需的处理。 (您的数据中可能没有null
的情况-在这种情况下,当您提问题时,您应该这样说。)
设置测试表:
create table input_tbl (id number primary key,details clob);
insert into input_tbl (id,details) values
(100,to_clob('134332:10.0,1481422:1.976,1483734:1.688,2835036:1.371'));
insert into input_tbl (id,details) values
(101,'134331:0.742,319892:0.734,1558987:0.7,2132090:0.697');
insert into input_tbl (id,details) values
(102,null);
insert into input_tbl (id,details) values
(103,'2332042: ');
commit;
查询:
with
tokenized (pid,ord,cid,wt) as (
select i.id,q.ord,q.cid,q.wt
from input_tbl i cross apply
(
select level as ord,regexp_substr(details,'(,|^)([^:]+):',1,level,null,2)
as cid,':([^,]*)',1) as wt
from dual
connect by level <= regexp_count(details,':')
) q
),arrayed (pid,json_arr) as (
select pid,json_arrayagg(json_object(key 'cId' value to_number(trim(cid)),key 'wt' value to_number(trim(wt)))
)
from tokenized
group by pid
)
select pid,json_object(key 'pId' value pid,key 'cid' value json_arr) as json
from arrayed
;
输出:
PID JSON
---- -----------------------------------------------------------------------------------------------------------------------------
100 {"pId":100,"cid":[{"cId":134332,"wt":10},{"cId":2835036,"wt":1.371},{"cId":1483734,"wt":1.688},{"cId":1481422,"wt":1.976}]}
101 {"pId":101,"cid":[{"cId":134331,"wt":0.742},{"cId":2132090,"wt":0.697},{"cId":1558987,"wt":0.7},{"cId":319892,"wt":0.734}]}
102 {"pId":102,"cid":[{"cId":null,"wt":null}]}
103 {"pId":103,"cid":[{"cId":2332042,"wt":null}]}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。