如何将下面字符串
3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM
截取成
C1201\0.400MM*1000MM
的样子
截取第二个“\”和第三个“\”之间的字符,以及最后一个“\”之后的字符?“\”的位置是会变化的
3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM
截取成
C1201\0.400MM*1000MM
的样子
截取第二个“\”和第三个“\”之间的字符,以及最后一个“\”之后的字符?“\”的位置是会变化的
简单举个instr()的例子:SELECT INSTR('12312','1',2) FROM dual;
--返回值为4
含义:取字符串‘12312’,中第二次出现‘1’的位置
SELECT substr(str,INSTR(str,'\',1,2)+1, INSTR(str,'\',1,3)-INSTR(str,'\',1,2)-1)||
SUBSTR(a.str, INSTR(str,'\',1,b.lv1-1))
from temp a, (
SELECT MIN(lv) lv1 from (
SELECT LEVEL lv, INSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '\', 1, LEVEL) NUM FROM dual
CONNECT BY LEVEL < length('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM')
) a where a.num=0
) b
;
(select level cnt, regexp_substr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '[^\]+', 1, level) res from dual
connect by level < 10)
select a.cnt, a.res from a where a.res is not null
and a.cnt = 3
union all
select a.cnt, a.res from a,
(select count(1) total from a where a.res is not null) sub
where a.cnt = sub.total
结果:
cnt res
3 C1201
6 0.400MM*1000MM
WITH temp as ( SELECT '3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM' str from dual )
SELECT substr(str,INSTR(str,'\',1,2)+1, INSTR(str,'\',1,3)-INSTR(str,'\',1,2)-1)||
SUBSTR(str, instr(str,'\',1,(LENGTH(str)-LENGTH(REPLACE(str,'\')))))
from temp a
;
(
ID VARCHAR2(20),
Des VARCHAR2(200)
);
INSERT INTO T141 VALUES('01', '3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM');
实测结果:
instr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM','\',1,2),
instr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM','\',1,3)
-instr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM','\',1,2)
)
||substr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM',
instr('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM','\',-1))
from dual
按照上面哥几个的做法,要是匹配规则灵活地改变了,该怎么办?随便在百度上搜了一个正则的SQL说明:http://www.cnblogs.com/tracy/archive/2010/04/15/1712591.html
INSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '\', 1, 2)+1,
INSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '\', 1, 3) -
INSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '\', 1, 2)-1)
||SUBSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM',
INSTR('3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM', '\', -1, 1)) FROM dual
下来查了一下资料,问题圆满解决,谢谢大家!