【Oracle】列拆行/对多行数据的单行数据进行分割并多行显示

发布时间 2024-01-10 17:28:41作者: DbWong_0918

【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中的源数据:

image

数据结果:

image

比较让人在意的是这句prior dbms_random.value is not null,好像目的是为了让这个随机数每次都输出不同的数据,防止ORACLE的检查:如果你有前后连接条件(id=PRIOR id),但是同一行数据再次出现,会报错

ERROR:ORA-01436: CONNECT BY loop in user data

加了这句以后就不会有报错提示了