Oracle 一行拆分为多行
测试数据:
- CREATE TABLE t (str VARCHAR2(30));
- INSERT INTO t VALUES ( 'X,Y,Z' );
- INSERT INTO t VALUES ( 'XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG' );
- commit;
--1、multiset 8i之后都支持
- SQL> CREATE OR REPLACE TYPE number_ntt AS TABLE OF NUMBER;
- 2 /
- Type created
- SQL> col value for a20
- SQL>
- SQL> with ilv as
- 2 (select str || ',' as str,
- 3 (length(str) - length(replace(str, ','))) + 1 as no_of_elements
- 4 from t)
- 5 select a.str, regexp_substr(a.str, '[^,]+', 1, b.column_value) value
- 6 from ilv a, table(cast(multiset (select rownum rn
- 7 from dual
- 8 connect by rownum <= a.no_of_elements) as number_ntt)) b;
- STR VALUE
- ------------------------------- --------------------
- X,Y,Z, X
- X,Y,Z, Y
- X,Y,Z, Z
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, XXX
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, Y
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, ZZ
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, AAAAA
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, B
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, CCC
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, D
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, E
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, F
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG, GGG
- 13 rows selected
- SQL>
2、自关联connect by 10g之后
- SQL> select str,
- 2 regexp_substr(str, '[^,]+', 1, level) value
- 3 from t
- 4 connect by
- 5 str = prior str
- 6 and instr(str||',', ',', 1, level) > 0
- 7 and prior dbms_random.value is not null;
- STR VALUE
- ------------------------------ --------------------
- X,Y,Z X
- X,Y,Z Y
- X,Y,Z Z
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG
- 13 rows selected
- SQL>
3、自关联,非CONNECT BY方式
- SQL> with tmp as (
- 2 select t.*,
- 3 length(str)-length(regexp_replace(str, ',', ''))+1 len
- 4 from t
- 5 )
- 6 select a.*, regexp_substr(str, '[^,]+', 1, rn) value
- 7 from tmp a, (select rownum rn from dual connect by level <= (select max(len) from tmp x)) b
- 8 where a.len>=b.rn
- 9 order by 1;
- STR LEN VALUE
- ------------------------------ ---------- --------------------
- X,Y,Z 3 Y
- X,Y,Z 3 Z
- X,Y,Z 3 X
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 GGG
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 B
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 CCC
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 D
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 E
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 F
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 ZZ
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 Y
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 XXX
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG 10 AAAAA
- 13 rows selected
- SQL>
4、Model子句,复杂度有点小高
- SQL> col single_element for a15
- SQL>
- SQL> with ilv as
- 2 (select str as orig_str,
- 3 ',' || str || ',' as mod_str,
- 4 1 as start_pos,
- 5 length(str) as end_pos,
- 6 (length(str) - length(replace(str, ','))) + 1 as element_count,
- 7 0 as element_no,
- 8 rownum as rn
- 9 from t)
- 10 select orig_str as original_string,
- 11 substr(mod_str, start_pos, end_pos - start_pos) as single_element,
- 12 element_no,
- 13 element_count
- 14 from (select *
- 15 from ilv
- 16 model partition by(rn, orig_str, mod_str)
- 17 dimension by(element_no)
- 18 measures(start_pos, end_pos, element_count)
- 19 rules iterate(2000)
- 20 until(iteration_number + 1 = element_count[0])(
- 21 start_pos[iteration_number + 1] = instr(cv(mod_str), ',', 1, cv(element_no)) + 1,
- 22 end_pos[iteration_number + 1] = instr(cv(mod_str), ',', 1, cv(element_no) + 1)
- 23 )
- 24 )
- 25 where element_no != 0
- 26 order by mod_str, element_no;
- ORIGINAL_STRING SINGLE_ELEMENT ELEMENT_NO ELEMENT_COUNT
- ------------------------------ --------------- ---------- -------------
- X,Y,Z X 1
- X,Y,Z Y 2
- X,Y,Z Z 3
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG XXX 1
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG Y 2
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG ZZ 3
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG AAAAA 4
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG B 5
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG CCC 6
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG D 7
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG E 8
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG F 9
- XXX,Y,ZZ,AAAAA,B,CCC,D,E,F,GGG GGG 10
- 13 rows selected
- SQL>
其他可以编写自定义函数进行拆分
Oracle 一行拆分为多行的更多相关文章
- Sql一行拆分转多行
select a.planid,b.mias, miaid into [1_cache3] from (select planid,mias=convert(xml,'<root>< ...
- Oracle一列的多行数据拼成一行显示字符
Oracle一列的多行数据拼成一行显示字符 oracle 提供了两个函数WMSYS.WM_CONCAT 和 ListAgg函数. www.2cto.com 先介绍:WMSYS.WM_CO ...
- mysql根据逗号将一行数据拆分成多行数据
mysql根据逗号将一行数据拆分成多行数据 原始数据 处理结果展示 DDL CREATE TABLE `company` ( `id` ) DEFAULT NULL, `name` ) DEFAULT ...
- Oracle数据库字段数据拆分成多行(REGEXP_SUBSTR函数)
做多选功能时为了简便,会在某个字段中存储多个值,保存时虽然省事,但后续的查询统计时还需要拆分数据才行,因此这时需要将字段内的值分成多行以便后续使用. 下面这个例子实现了字段内数据的拆分: --创建测试 ...
- Oracle 字段拆分替换在合并成一条
看了网上很多Oracle字段拆分的实例,但是都未能完全满足要求,或许是我水平不够未能很好的理解,如果有大神懂得并且愿意告知我的,可以私信我,在这里真诚的感谢! 1. 首先建立表并插入测试数据 drop ...
- POI中getLastRowNum() 和getLastCellNum()的区别 hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
hssfSheet.getLastRowNum();//最后一行行标,比行数小1 hssfSheet.getRow(k).getLastCellNum();//获取列数,比最后一列列标大1
- SQL SERVER 拆分列为多行
--创建测试表 )) insert into #temp(names) values('张三,李四'), ('中国,美国,巴西'), ('深圳,上海,北京,广州,哈尔滨'), ('足球,篮球,乒乓球, ...
- 利用jquery表格添加一行并在每行第一列大写字母显示实现方法
表格添加一行并在每行第一列大写字母显示jquery实现方法 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN& ...
- Pandas: 如何将一列中的文本拆分为多行? | Python
Pandas: 如何将一列中的文本拆分为多行? 在数据处理过程中,经常会遇到以下类型的数据: 在同一列中,本该分别填入多行中的数据,被填在一行里了,然而在分析的时候,需要拆分成为多行. 在上图中,列名 ...
随机推荐
- Microsoft IIs tilde directory enumeration
漏洞标题: iis 短文件名列举漏洞 检测: https://code.google.com/p/iis-shortname-scanner-poc/ 查看扫描出来的目录,全是404 ,比 ...
- 【bzoj4031】[HEOI2015]小Z的房间 Matrix-Tree定理+高斯消元
[bzoj4031][HEOI2015]小Z的房间 2015年4月30日3,0302 Description 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的 ...
- bzoj 2788 [Poi2012]Festival 差分约束+tarjan+floyd
题目大意 有n个正整数X1,X2,...,Xn,再给出m1+m2个限制条件,限制分为两类: 1.给出a,b (1<=a,b<=n),要求满足Xa + 1 = Xb 2.给出c,d (1&l ...
- 16深入理解C指针之---迷途指针
一.若程序中存在迷途指针,轻则导致程序退出,重则使程序出现重大逻辑错误 1.定义:内存已释放,指针依旧指向原始内存,这种指针就是迷途指针 2.迷途指针和指针别名: 1).指针依旧指向已释放的内存,无法 ...
- [转]iOS7 后台执行
[转自:http://esoftmobile.com/2013/06/23/ios7%E7%A8%8B%E5%BA%8F%E5%90%8E%E5%8F%B0%E8%BF%90%E8%A1%8C/] i ...
- AC日记——[Sdoi2013]森林 bzoj 3123
3123: [Sdoi2013]森林 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 3216 Solved: 944[Submit][Status] ...
- AC日记——旅行 洛谷 P3313
题目描述 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我 ...
- Skiing(最短路)
poj——3037 Skiing Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4921 Accepted: 1315 ...
- luogu P2894 [USACO08FEB]酒店Hotel
题目描述 The cows are journeying north to Thunder Bay in Canada to gain cultural enrichment and enjoy a ...
- 327. Count of Range Sum
/* * 327. Count of Range Sum * 2016-7-8 by Mingyang */ public int countRangeSum(int[] nums, int lowe ...