Database 在oracle中将一行拆分为多行
我有一个包含如下数据的表:Database 在oracle中将一行拆分为多行,database,oracle,select,view,Database,Oracle,Select,View,我有一个包含如下数据的表: CREATE TABLE UDA_DATA ( uda VARCHAR2(20), value_text VARCHAR2(4000) ); insert into UDA_DATA values('Material_ID','PBL000129 PBL000132 PBL000130 PBL000131 PBL000133'); insert into UDA_DATA values('Material_ID','PBL000134 PBL000138 P
CREATE TABLE UDA_DATA
( uda VARCHAR2(20),
value_text VARCHAR2(4000)
);
insert into UDA_DATA values('Material_ID','PBL000129 PBL000132 PBL000130 PBL000131 PBL000133');
insert into UDA_DATA values('Material_ID','PBL000134 PBL000138 PBL000135 PBL000136 PBL000137');
insert into UDA_DATA values('Material_ID','PBL000125 PBL000128 PBL000126 PBL000124 PBL000127');
commit;
select * from UDA_DATA;
现在,如果我们从该表中选择数据,将得到如下结果:
CREATE TABLE UDA_DATA
( uda VARCHAR2(20),
value_text VARCHAR2(4000)
);
insert into UDA_DATA values('Material_ID','PBL000129 PBL000132 PBL000130 PBL000131 PBL000133');
insert into UDA_DATA values('Material_ID','PBL000134 PBL000138 PBL000135 PBL000136 PBL000137');
insert into UDA_DATA values('Material_ID','PBL000125 PBL000128 PBL000126 PBL000124 PBL000127');
commit;
select * from UDA_DATA;
结果如下:
但无论如何,我期待着这样的事情:
表示如果字符长度超过30,则应将值\u text
分成两行或多行。此外,uda列的后缀应为1,2..n
不确定如何在select查询中实现这一点。您可以使用:
锚定成员使用substr
获取前30个字符作为值,并为锚定设置一个始终为1的区块编号。它还获取删除前30个字符后字符串的剩余部分,这些字符可能为空
递归成员的操作完全相同,但使用上一次迭代找到的字符串的剩余部分,并将数据块的数量递增
最后,主查询只获取所有提取的块,并将块编号附加到uda
字符串
如果有唯一的键,您可以使用分层查询,但是您显示的数据没有唯一的键
您的示例数据没有任何有用的结果排序依据。如果您的实际表有一个唯一的键,您可以使用它,方法是将它包含在递归CTE的两个分支中,然后将其添加到最终结果中,如下所示
order by unique_key, chunk_num
如果未启用,则可以通过在锚定成员中引入一个虚拟键(例如,使用row_number()
或更简单的rownum
)更接近预期结果:
with rcte (rn, uda, value, chunk_num, value_text) as (
select rownum,
uda,
substr(value_text, 1, 30),
1,
substr(value_text, 31)
from uda_data
union all
select rn,
uda,
substr(value_text, 1, 30),
chunk_num + 1,
substr(value_text, 31)
from rcte
where value_text is not null
)
select uda || chunk_num as uda, value
from rcte
order by rn, chunk_num;
UDA VALUE
-------------------- ----------------------------------------
Material_ID1 PBL000129 PBL000132 PBL000130
Material_ID2 PBL000131 PBL000133
Material_ID1 PBL000134 PBL000138 PBL000135
Material_ID2 PBL000136 PBL000137
Material_ID1 PBL000125 PBL000128 PBL000126
Material_ID2 PBL000124 PBL000127
谢谢你的帮助,但你所展示的结果并不是我所期望的。@ShashankJha-怎么会这样?它看起来与您发布给我的图像相同,只是它没有排序-而且您没有任何可排序的依据,因为您原始的
uda
值不是唯一的。此外,我需要在30个字符后打断文本,不是空格对不起,我的错误,数据格式是正确的,非常感谢,但我需要在30个字符后打破它,这也是不固定的,有时它也可以是10或100。@ShashankJha-哦,对了,我完全误解了这一点;有了角色限制就更容易了。将30更改为其他值也应该相当简单,但这取决于该限制来自何处以及如何执行查询(替换变量、绑定变量…)。