字符串 1,0,100,5;2,100,500,20;3,500,1000,40;转化成如下表
1 0 100 5
2 100 500 20
3 500 1000 40
1 0 100 5
2 100 500 20
3 500 1000 40
解决方案 »
- oracle 10g dataGuard 问题
- 求助:全连接查询问题,路过的看看,先谢过了,急!
- ORA 00257 : archiver error. Connect internal only, until freed
- 请教jpetstore-oracle-dataload.sql用什么程序打开啊?
- ORACLE 数据库 中存储过程的调用(菜鸟问)
- 怎样用SQL语句删除字段
- 急救,听说Oracle自身就可以做到象Win2000 advance server的Cluster(群集)
- 请教select into的问题。
- 日期问题:to_date()函数
- win 2003+oracle 9i oci_connect() ora-01031
- 请教一SQL。谢谢
- oracle 触发器问题
2 b as (select substr(str1, instr(str1,';',1,level)+1,
3 instr(str1,';',1,level+1)-instr(str1,';',1,level)-1) as str2
4 from a connect by level <=length(a.str1)-length(replace(a.str1,';','')) ),
5 c as (select str2,
6 substr(str2,1, instr(str2,',',1,1)-1) as str2_p1,
7 substr(str2,instr(str2,',',1,1)+1,instr(str2,',',1,2)-instr(str2,',',1,1)-1) as str2_p2,
8 substr(str2,instr(str2,',',1,2)+1,instr(str2,',',1,3)-instr(str2,',',1,2)-1) as str2_p3,
9 substr(str2,instr(str2,',',1,3)+1) as str2_p4
10 from b )
11 select c.str2, c.str2_p1, c.str2_p2, c.str2_p3, c.str2_p4 from c;STR2 STR2_P1 STR2_P2 STR2_P3 STR2_P4
------------------- ------------ ------------ ------------ ------------
1,0,100,5 1 0 100 5
2,100,500,20 2 100 500 20
3,500,1000,40 3 500 1000 40
b as (select substr(str1, instr(str1,';',1,level)+1,
instr(str1,';',1,level+1)-instr(str1,';',1,level)-1) as str2
from a connect by level <=length(a.str1)-length(replace(a.str1,';','')) )
select b.str2 from b;STR2
------------------------------------------------------------
1,0,100,5
2,100,500,20
3,500,1000,40
-- 上一步是拆分分号(;),下一步是拆分逗号(,) (如果你每部分的逗号最多三个,即:最多四个字段,则可以这样写:)
with a as (select ';'||'1,0,100,5;2,100,500,20;3,500,1000,40;' as str1 from dual),
b as (select substr(str1, instr(str1,';',1,level)+1,
instr(str1,';',1,level+1)-instr(str1,';',1,level)-1) as str2
from a connect by level <=length(a.str1)-length(replace(a.str1,';','')) ),
c as (select str2,
substr(str2,1, instr(str2,',',1,1)-1) as str2_p1,
substr(str2,instr(str2,',',1,1)+1,instr(str2,',',1,2)-instr(str2,',',1,1)-1) as str2_p2,
substr(str2,instr(str2,',',1,2)+1,instr(str2,',',1,3)-instr(str2,',',1,2)-1) as str2_p3,
substr(str2,instr(str2,',',1,3)+1) as str2_p4
from b )
select c.str2, c.str2_p1, c.str2_p2, c.str2_p3, c.str2_p4 from c;
--多写了几行,写了个还算通用的
[SYS@orcl] SQL>WITH t AS(
2 SELECT '1,0,100,5;2,100,500,20;3,500,1000,40;' col FROM dual
3 UNION ALL
4 SELECT '4,1,101,6;5,101,501,21;6,501,1001,41;' col FROM dual
5 UNION ALL
6 SELECT '7,2,102,7;8,102,502,22;9,502,1002,42;' col FROM dual
7 )--上面是模拟数据,可以不用管
8 SELECT REGEXP_SUBSTR(A, '[^, ]+', 1, 1) AS A1, --取第一个逗号前面所有字符(如果变换为其他字符自己改正)
9 REGEXP_SUBSTR(A, '[^, ]+', 1, 2) AS A2, --取第二个逗号前面所有字符(如果变换为其他字符自己改正)
10 REGEXP_SUBSTR(A, '[^, ]+', 1, 3) AS A3, --取第三个逗号前面所有字符(如果变换为其他字符自己改正)
11 REGEXP_SUBSTR(A, '[^, ]+', 1, 4) AS A4 --取第四个逗号前面所有字符(如果变换为其他字符自己改正,如果还有字段继续按照规律添加【1,5】之类的)
12 FROM (SELECT REGEXP_SUBSTR(RTRIM(COL, ';'), '[^; ]+', 1, L) AS A
13 FROM T, (SELECT LEVEL L FROM DUAL CONNECT BY LEVEL <= 100) T1
14 WHERE LENGTH(RTRIM(COL, ';')) -
15 LENGTH(REPLACE(RTRIM(COL, ';'), ';')) + 1 >= T1.L) --子查询为按照[;]分隔你的字符串,最大支持100-1=99个[;](不包括字符串最后的分号),想支持更大将[<=100]自行调整
16 ORDER BY A1
17 ;A1 A2 A3 A4
----- ----- ----- -----
1 0 100 5
2 100 500 20
3 500 1000 40
4 1 101 6
5 101 501 21
6 501 1001 41
7 2 102 7
8 102 502 22
9 502 1002 42已选择9行。
A1 A2 A3 A4
----- ----- ----- -----
1 0 100 5
2 20我想要的是
A1 A2 A3 A4
----- ----- ----- -----
1 0 100 5
2 0 0 20
该改哪里?