【发布时间】:2020-12-12 20:11:44
【问题描述】:
我有一个表,其中包含类似这样的数据:
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','PBL0001341 PBL0001381 PBL0001351 PBL0001361 PBL0001371');
commit;
现在如果我们从这个表中选择数据,它会给出如下结果:
select * from UDA_DATA;
它给出的结果是这样的:
但是我期待这样的事情:
意味着如果字符长度超过 30,它应该将 value_text 分成两行或多行。此外,uda 列的后缀应该是 1,2..n,并且它不应该打破中间的文本。
写了一个递归 CTE 来获得结果:
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;
结果如下:
在第三行,它打破了不正确的文本,想要这样的结果:
任何帮助将不胜感激。
【问题讨论】:
-
regexp_replace(value_text,'(.{1,30}+)\s','\1,')在需要的地方用逗号替换空格