【Oracle】列拆行/对多行数据的单行数据进行分割并多行显示
【Oracle】列拆行/对多行数据的单行数据进行分割并多行显示
参考链接:Oracle 一行字符串拆分为多行_oracle一行拆分成多行-CSDN博客
背景:要对一个表的字段的内容进行分割,分隔符都是指定的
原数据:
'1','2','3','4' |
---|
'5','6','7','8' |
新数据(按照逗号分割):
'1' |
---|
'2' |
'3' |
'4' |
'5' |
'6' |
'7' |
'8' |
如果是单行的数据,一般习惯用下面的语句进行分割
select tt.ll
from (select regexp_substr(replace(XXX, ',', ' ,'), '[^,]+', 1, level) ll
from dual
connect by level <= regexp_count(XXX, ',') + 1) tt
where rownum <= regexp_count(XXX, ',') + 1
但是这种语句只能对单行数据进行操作
上网找了一下,可以用下面的语句进行多行分割
select a.*,
level lev,
regexp_count(a.code,'[^,]+') as regcou,
regexp_substr(a.code,'[^,]+',1,level) as new_col
from tablea a
connect by prior a.id = a.id
and prior dbms_random.value is not null
and level <= regexp_count(a.code,'[^,]+')
tablea中的源数据:
数据结果:
比较让人在意的是这句prior dbms_random.value is not null,好像目的是为了让这个随机数每次都输出不同的数据,防止ORACLE的检查:如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,会报错
ERROR:ORA-01436: CONNECT BY loop in user data
加了这句以后就不会有报错提示了
您能读到这儿,我呢是发自真心的感谢您,若要转载,还望请您带上链接