如何将下面字符串
3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM 
截取成 
C1201\0.400MM*1000MM 
的样子 
截取第二个“\”和第三个“\”之间的字符,以及最后一个“\”之后的字符?“\”的位置是会变化的

解决方案 »

  1.   

    可以使用substr()与instr()组合使用。
    简单举个instr()的例子:SELECT INSTR('12312','1',2) FROM dual;
    --返回值为4
    含义:取字符串‘12312’,中第二次出现‘1’的位置
      

  2.   

    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(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
    ;
      

  3.   

    with a as
    (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
      

  4.   

    刚才随便写了一个,再改下。
    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
    ;
      

  5.   

    实测数据:CREATE TABLE T141
    (
        ID VARCHAR2(20),
        Des VARCHAR2(200)
    );
    INSERT INTO T141 VALUES('01', '3G\01\C1201\GB/T 2518-2008\SGCC\0.400MM*1000MM');
    实测结果:
      

  6.   

    select 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,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              
      

  7.   

    了解下instr的函数用户,就迎刃而解了
      

  8.   

    我觉得,其实这是在问一个在Oracle中如何使用正则表达式的问题.
    按照上面哥几个的做法,要是匹配规则灵活地改变了,该怎么办?随便在百度上搜了一个正则的SQL说明:http://www.cnblogs.com/tracy/archive/2010/04/15/1712591.html
      

  9.   

    select 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, 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
     
    下来查了一下资料,问题圆满解决,谢谢大家!