我的需求是查询一个表中name字段,而字段中的数据格式是 dfsdf_名字和 434.名字。 我需要将_和.后面的取出来,怎么实现?

解决方案 »

  1.   

    单个的是这样,select substr(name,instr('name','_',1,1),length(name)) from org
    但是俩个的话需要怎么做?
      

  2.   

    --测试数据
    create table test1(name varchar2(100));
    insert into test1 
    select 'dfsdf_名字' from dual union all select '434.名字' from dual;
    --执行查询
    select 
    case when instr(name, '_',1,1) >0 then substr(name,instr( name, '_',1,1)+1,length(name)) else substr(name,instr( name, '.',1,1)+1,length(name)) end name
    from test1
      

  3.   

    做一个函数,或者正则表达式都可以的。后者的话,需要10G数据库。
    假如的名字里面不出现,434.或者dfsdf_的话,REPLACE也可以。
      

  4.   

    SELECT CASE
              WHEN INSTR (col, '.', 1, 1) > 0
                 THEN SUBSTR (col, INSTR (col, '.') + 1, LENGTH (col))
              WHEN INSTR (col, '_', 1, 1) > 0
                 THEN SUBSTR (col, INSTR (col, '_') + 1, LENGTH (col))
              ELSE col
           END
      FROM (SELECT 'a.1' col
              FROM DUAL
            UNION ALL
            SELECT 'a.2' col
              FROM DUAL
            UNION ALL
            SELECT 'a.3' col
              FROM DUAL
            UNION ALL
            SELECT 'a_4' col
              FROM DUAL
            UNION ALL
            SELECT 'a_5' col
              FROM DUAL
            UNION ALL
            SELECT 'a_6' col
              FROM DUAL)
      

  5.   

    select 
           case 
           when instr(emp.name,'.',1,1)> 0
                then substr(emp.name,instr(emp.name,'.',1,1)+1)
           when instr(emp.name,'_',1,1)> 0
                then substr(emp.name,instr(emp.name,'_',1,1)+1)
           else ''
           end t_name
    from emp
      

  6.   

    select 
    substr(name, 
           instr(name,'_',1,1) + 1,
           instr(name,'_',1,2) - 1 - instr(name,'_',1,1) 
          ) as a, 
    substr(name, 
           instr(name,'.',1,1) + 1,
           instr(name,'.',1,2) - 1 - instr(name,'.',1,1) 
          ) as b
    from org
      

  7.   

    select   
    substr(name,   
           instr(name, '_',1,1)   +   1, 
           case  
              when instr(name,'_',1,2) >0 
      then instr(name,'_',1,2) - 1 - instr(name,'_',1,1)
      else length(name) 
           end
         ) as a,   
    substr(name,   
           instr(name, '.',1,1)   +   1, 
           case  
              when instr(name,'.',1,2) >0 
      then instr(name,'.',1,2) - 1 - instr(name,'.',1,1)
      else length(name) 
           end
         ) as b
    from   org对name再处理一下就行了..