Oracle 字段值按逗号拆分,变为多行数据

问题原因:   由于数据库中某个字段含有大量数据由逗号开(且多列,逗号个数不固定)

解决办法:

select distinct * from (
select regexp_substr(q.nums, [^,]+, 1, Level,i) order_num, names
  from (
  select 1,2,3 nums, 张三 names from dual
  union all
  select 4,5 nums, 李四 names from dual
  union all
  select 5,6 nums, 王五 names from dual
  ) q
connect by Level <= LENGTH(q.nums) - LENGTH(REGEXP_REPLACE(q.nums, ,, )) + 1) order by order_num;

重点内容:

REGEXP_SUBSTR函数格式如下:
function REGEXP_SUBSTR(String, pattern, position, occurrence, modifier)
        srcstr     :需要进行正则处理的字符串
		pattern    :进行匹配的正则表达式
		position   :起始位置,从第几个字符开始正则表达式匹配(默认为1)
		occurrence :标识第几个匹配组,默认为1
		modifier   :模式(i不区分大小写进行检索;c区分大小写进行检索。默认为c。)


connect by 用法
Oracle中的select语句可以用start with ... connect by prior ...子句实现递归查询,connect by 是结构化查询中用到的,其基本语法是:
select ... from  
where <过滤条件,用于对返回的所有记录进行过滤> 
start with <根结点的限定语句,当然可以放宽限定条件,以取得多个根结点,实际就是多棵树> 
connect by [prior] <连接条件,其中用prior表示上一条记录,比如:connect by prior t.id = t.parent_id就是说上一条记录的id 是本条记录的parent_id,即本记录的父亲是上一条记录>
经验分享 程序员 微信小程序 职场和发展