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更改为其他值也应该相当简单,但这取决于该限制来自何处以及如何执行查询(替换变量、绑定变量…)。