分隔字串实现列转行

[复制链接]
查看11 | 回复9 | 2015-3-6 11:57:31 | 显示全部楼层 |阅读模式
字符串如下:004-007号,004-006号,10188,10239,004-005号,010-003号,010-002号,030-001号,030-002号,006号,008-003号,054-001号,038,012,170-002号,181-001号,181-002号,175-003号,008-008号,175-006号,170-006号,170-005号,175-001号
求结果集如下:
ID
VALUE
1
004-007号
2
004-006号
3
10188
4
10239
5
004-005号
6
010-003号
7
010-002号
8
030-001号
9
030-002号
10
006号
11
008-003号
12
054-001号
13
038
14
012
15
170-002号
16
181-001号
17
181-002号
18
175-003号
19
008-008号
20
175-006号
21
170-006号
22
170-005号
23
175-001号
两种快捷的实现方式如下:
1、借助系统函数
[php]
SQL> select rownum id, column_value value from table(sys.odcivarchar2list('004-007号','004-006号','10188','10239','004-005号','010-003号','010-002号','030-001号','030-002号','006号','008-003号','054-001号','038','012','170-002号','181-001号','181-002号','175-003号','008-008号','175-006号','170-006号','170-005号','175-001号'));
ID VALUE
---------- ------------------------------
1 004-007号
2 004-006号
3 10188
4 10239
5 004-005号
6 010-003号
7 010-002号
8 030-001号
9 030-002号
10 006号
11 008-003号
12 054-001号
13 038
14 012
15 170-002号
16 181-001号
17 181-002号
18 175-003号
19 008-008号
20 175-006号
21 170-006号
22 170-005号
23 175-001号
23 rows selected.
--
[/php]
2、借助正则表达式
[php]
SQL> select rownum rn,TRIM(REGEXP_SUBSTR('004-007号,004-006号,10188,10239,004-005号,010-003号,010-002号,030-001号,030-002号,006号,008-003号,054-001号,038,012,170-002号,181-001号,181-002号,175-003号,008-008号,175-006号,170-006号,170-005号,175-001号', '[^,]+', 1, level)) value from dual
2 connect by level <= length(regexp_replace('004-007号,004-006号,10188,10239,004-005号,010-003号,010-002号,030-001号,030-002号,006号,008-003号,054-001号,038,012,170-002号,181-001号,181-002号,175-003号,008-008号,175-006号,170-006号,170-005号,175-001号','[^,]*'))+1;
RN VALUE
---------- ------------------------------
1 004-007号
2 004-006号
3 10188
4 10239
5 004-005号
6 010-003号
7 010-002号
8 030-001号
9 030-002号
10 006号
11 008-003号
12 054-001号
13 038
14 012
15 170-002号
16 181-001号
17 181-002号
18 175-003号
19 008-008号
20 175-006号
21 170-006号
22 170-005号
23 175-001号
23 rows selected.
--
[/php]
注:上述方式均需在10g以上版本中运行。
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
不错啊!
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
学习!
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
很好,很有用处
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
第一个例子,跟第二个例子还是有区别的
第一个例子的是多个字符串,但是第二个例子里,就是一个字符串
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
严重支持!
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
odcivarchar2list的做法比较新颖,但实用上不如第二个,因为你事先往往不知道有多少个,如果用动态SQL又有绑定变量问题。
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
不错哦
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
只是用的9I
回复

使用道具 举报

千问 | 2015-3-6 11:57:31 | 显示全部楼层
如果9I的话估计要用INSTR来实现了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行