情况是这样滴:
用户输入一些字串,代表箱数,比如:‘A1-A12’,'A14-A25','A26'
很明显‘A1-A12’,代表12箱,'A14-A25'也代表12箱,'A26'只代表1箱
但怎么得到代表的箱数?用户有可能输入‘AB1-AB12’我现在用select substr('A14-A25',-2,2)-substr('A14-A25',2,2) from dual 这样OK,
但‘A1-A12’这个字串就不行了。。
其实就是怎么找到中间的 - 比较重要,然后就可以判断'A26'这种箱号了一下忘了。。求救下~!

解决方案 »

  1.   

    instr()函数,返回搜索字符出现的位置。语法如下:instr( string1, string2 [, start_position [, nth_appearance ] ] ) string1 源字符串,要在此字符串中查找。string2 要在string1中查找的字符串.start_position 代表string1 的哪个位置开始查找。此参数可选,如果省略默认为1. 字符串索引从1开始。如果此参数为正,从左到右开始检索,如果此参数为负,从右到左检索,返回要查找的字符串在源字符串中的开始索引。 nth_appearance 代表要查找第几次出现的string2. 此参数可选,如果省略,默认为 1.如果为负数系统会报错。
    注意:如果String2在String1中没有找到,instr函数返回0. 应用于:Oracle 8i, Oracle 9i, Oracle 10g, Oracle 11g 
    举例说明:select instr('abc','a') from dual;    -- 返回 1 
    select instr('abc','bc') from dual; -- 返回 2
    select instr('abc abc','a',1,2) from dual; -- 返回 5
    select instr('abc','bc',-1,1) from dual; -- 返回 2
    select instr('abc','d') from dual; -- 返回 0
      

  2.   

      谢了,刚查出了点眉目   应该没多大问题~!  对instr这个函数太不熟悉了  呵呵
      

  3.   

    这个用正则最好了select 
    regexp_replace(replace('A1-A26','A',''),'(.+)\-(.+)','\2')-
    regexp_replace(replace('A1-A26','A',''),'(.+)\-(.+)','\1')+1 from dual
    /
      

  4.   

    请教下:为什么 SELECT instr('A14-A25111','-',-1,1) FROM DUAL
    和   SELECT instr('A14-A25','-',-1,1) FROM DUAL返回的值都是4?
      

  5.   

    没测试,试试这个看行吗?select substr('A1-A12',instr('A1-A12','-',-1,1)+2) 
           - substr('A1-A12',2,length(instr('A1-A12','-','1'))-1) 
     from dual; 
      

  6.   


    select  substr('A1-A12',2,length(instr('A1-A12','-','1'))-1)  from dual 这个是空值。。
      

  7.   


    --写得有点复杂 ,等下在写个
    SQL> 
    SQL> with tb as
      2  (select 'A1-A12' str from dual union all
      3  select 'A14-A25' from dual union all
      4  select 'A26' from dual)
      5  select decode(sign(abs(substr(regexp_replace(str,'[[:alpha:]]',''),1,
      6  decode(sign(instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)),1,instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)-1,3
      7  ))-
      8  substr(regexp_replace(str,'[[:alpha:]]',''),
      9  decode(sign(instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)),1,instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)+1,1
     10  )))),1,abs(substr(regexp_replace(str,'[[:alpha:]]',''),1,
     11  decode(sign(instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)),1,instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)-1,3
     12  ))-
     13  substr(regexp_replace(str,'[[:alpha:]]',''),
     14  decode(sign(instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)),1,instr(regexp_replace(str,'[[:alpha:]]',''),'-',1)+1,1
     15  ))),0,1)
     16  from tb
     17  /
     
    DECODE(SIGN(ABS(SUBSTR(REGEXP_
    ------------------------------
                                11
                                11
                                 1
      

  8.   

    试试:
    select substr('A1-A12',2,length(instr('A1-A12','-',-1,1))) from dual 
      

  9.   


    --你看,这是两个的。
    ----如果-1就是8,如果是+1就是4
    SQL> SELECT instr('A14-A33-A25','-',-1,1) FROM DUAL;INSTR('A14-A33-A25','-',-1,1)
    -----------------------------
                                8嗯因为你只有一个‘-’这样符号,从左到右,从右到左都是他。
      

  10.   

      regexp_replace这个函数怪怪的   一用就报这个错  :
    ORA-00904: "REGEXP_REPLACE": invalid identifier
      

  11.   

    你的数据库什么版本的 可能不支持--可以用这个
    SQL> with tb as
      2  (select 'A1-A12' str from dual union all
      3  select 'A14-A25' from dual union all
      4  select 'A26' from dual),
      5  tb2 as (select trim(translate(str,translate(str,'0123456789','#'),' ')) str2 from tb)
      6  select abs(decode(sign(instr(str2,' ',1)),1,substr(str2,1,instr(str2,' ',1)-1),0,substr(str2,1)+1)-
      7  decode(sign(instr(str2,' ',1)),1,substr(str2,instr(str2,' ',1)+1),0,substr(str2,1)))
      8  from tb2
      9  /
     
    ABS(DECODE(SIGN(INSTR(STR2,'',
    ------------------------------
                                11
                                11
                                 1
      

  12.   

    SQL> SELECT decode(regexp_substr('AB12-AB23', '[0-9]+', 1, 2),NULL,1,
      2                regexp_substr('AB12-AB23', '[0-9]+', 1, 2) - regexp_substr('AB12-AB23', '[0-9]+') + 1)
      3    FROM dual;
     
    DECODE(REGEXP_SUBSTR('AB12-AB2
    ------------------------------
                                12
     
    SQL> 
    SQL> SELECT decode(regexp_substr('AB12', '[0-9]+', 1, 2),NULL,1,
      2                regexp_substr('AB12', '[0-9]+', 1, 2) - regexp_substr('AB12', '[0-9]+'))
      3    FROM dual;
     
    DECODE(REGEXP_SUBSTR('AB12','[
    ------------------------------
                                 1
     
    SQL> 
      

  13.   

      藐视是比较古老。。一些函数都不能用的样子现在台北还老更新。。准备年底开始直接上ERP R12了  DB也会相应升级吧。。