1.说明
在一行转多行时,我们多半将一张维护表分成单列的维护数据,然后再进行汇总,关联,这样能避免一些不必要的错误.一个table中,只有要拆分的数据和主键.如果要拆分多行,即将他们拆分为不同的table
2.简单的拆分
此语句是以逗号拆分,一行转多行,替换为自己需要的代码即可使用
select DISTINCT id,name,
regexp_substr(maintain,'[^,]+',1,LEVEL)maintain
from table
CONNECT BY LEVEL <= LENGTH(maintain) - LENGTH(REGEXP_REPLACE(maintain, ',', '')) + 1
order by id,name
3.另一种拆分
此方法在拆分过多的数据时,也可以保持很高的效率
SELECT id,name,
substr(maintain, instr(maintain, ',', 1, levels.lvl) + 1, instr(maintain, ',', 1, levels.lvl + 1) -(instr(maintain, ',', 1, levels.lvl) + 1)) as maintain
FROM
(SELECT id,name,',' || maintain || ',' AS maintain,length(maintain) - nvl(length(REPLACE(maintain, ',')), 0) + 1 AS cnt
FROM table ) a,
(SELECT rownum AS lvl FROM (SELECT MAX(length(maintain || ',') - nvl(length(REPLACE(maintain, ',')), 0)) max_len
FROM table) CONNECT BY LEVEL <= max_len) levels
WHERE levels.lvl <= a.cnt order by id,name
4.参考
王威振的csdn的(oracle 一行拆分多行)
喝醉的马儿的(oracle 一行转多行)
5.多行转一行
listagg(distinct xx,',') within group(order by sort)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)