取第一个段(A):
select RTRIM(REGEXP_SUBSTR('A_BC_DEF_GHI_JKL_MN','.+?(_)'),'_') from dual;
取第二个段(BC):
select replace(REGEXP_SUBSTR('A_BC_DEF_GHI_JKL_MN','(_).+?(_)'),'_','') from dual;
取第二个段(DEF):
???
……

解决方案 »

  1.   

    直接用substr()截取,不行吗?
      

  2.   

    用instr()+substr()查找啊,regular express是从10g才开始的,想帮你做一个都没有可能:-)
      

  3.   

    给你个说明吧,最下面有例子,也许有点用http://stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/functions116.htm
      

  4.   

    你就用instr,substr
    instr('A_BC_DEF_GHI_JKL_MN','_',2)代表 '_'第二次出现的位置
    DEF 就在第二次和第三次之间select 
    substr('A_BC_DEF_GHI_JKL_MN',
        instr('A_BC_DEF_GHI_JKL_MN','_',1,2)+1,
        instr('A_BC_DEF_GHI_JKL_MN','_',1,3)-
        (instr('A_BC_DEF_GHI_JKL_MN','_',1,2)+1)
    )
    from dual
      

  5.   


    --取第n个段,则用\n
    SELECT REGEXP_REPLACE('A_BC_DEF_GHI_JKL_MN', '([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)','\3') FROM dual;
    REG
    ---
    DEF
      

  6.   


    --取第n个段,则用\nSELECT REGEXP_REPLACE('A_BC_DEF_GHI_JKL_MN', '([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)','\3') 
    FROM dual;
      

  7.   

    如果第n个段没有值,则不能取出空,而是全部
    SELECT REGEXP_REPLACE('A_BC_DEF_GHI__MN', '([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)','\5') 
    FROM dual; 
      

  8.   

    如果第n个段含空格符,则不能取出,而是全部 
    SELECT REGEXP_REPLACE('A_BC_DEF_GHI_ A_MN', '([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)_([[:alpha:]]+)','\5') 
    FROM dual; 
      

  9.   

    这样就可以了:
    Select REGEXP_REPLACE('A_BC_DEF_GH5I_ _MN','(.*)_(.*)_(.*)_(.*)_(.*)_(.*)', '\5') FROM dual;