例如:类似这样的值:DEPT_BMLD_BSTAZM00  ,DEPT_JSSLD_BSTAZ09我要截取出 BMLD 和 BSTAZM00根据下划线截取怎么写SQL呢?

解决方案 »

  1.   

    select regexp_substr('DEPT_BMLD_BSTAZM00', '[^_]+', 1, level) from dual
    connect by level <= length(regexp_replace('DEPT_BMLD_BSTAZM00', '[^_]+', null))+1
    结果:
    DEPT
    BMLD
    BSTAZM00
      

  2.   

    这条语句在DB2中报错啊,!有更简单的方式吗?比如,分开两条sql,一条截取BMLD 一条截取 BSTAZM00我需要这样来做子查询
      

  3.   


    其实没你想的那么复杂,我只要得到第一个下划线的下标,和第二个下划线的小标就可以了,类似这样写 :substr('DEPT_BMLD_BSTAZM00',第一个下划线的下标,第二个下划线的下标); 这样得到 BMLDsubstr('DEPT_BMLD_BSTAZM00'第二个下划线的下标); 这样得到BSTAZM00就是不知道怎么写 
      

  4.   

    按照要求截的……
    SELECT SUBSTR('DEPT_BMLD_BSTAZM00',INSTR('DEPT_BMLD_BSTAZM00','_',1,1)+1,
    INSTR('DEPT_BMLD_BSTAZM00','_',1,2)-INSTR('DEPT_BMLD_BSTAZM00','_',1,1)-1 ) ,
    SUBSTR('DEPT_BMLD_BSTAZM00',INSTR('DEPT_BMLD_BSTAZM00','_',1,2)+1 ) FROM DUALDB2不会……^_^
      

  5.   

    如果只有两个下划线,可以用这个写法,应该是通用的。SELECT SUBSTR(item,1,instr(item,'_') -1)                                                             AS fst,
      SUBSTR(item,instr(item,'_')        + 1,instr(item,'_',instr(item,'_') + 1) - instr(item,'_') - 1 ) AS scd /*instr的特殊用法,指定起始位置instr(item,'_',从第一个下划线后一个位置开始)*/
    FROM
      ( SELECT 'aaa_bbb_ccc' AS item FROM dual
      UNION ALL
      SELECT 'dd_ee_ff' AS item FROM dual
      )
    --结果
    FST         SCD         
    ----------- ----------- 
    aaa         bbb         
    dd          ee