我有一个字段是由英文和字母组成的,如:BA12345或是1122AF,在查询中,我需要做的是得到BA12345减1后的数,即为BA12344,同样,1122AF减1得到1122AE有没有什么办法用SQL能够实现这个

解决方案 »

  1.   

    SQL> select substr(name,1,length(name)-1)||chr(ascii(substr(name,-1)) -1) 
      2  from test where id in (12,13);SUBSTR(NAME,1,LENGTH(NAME)-1)||CHR(ASCII(S
    ------------------------------------------
    hl2321
    12hhicSQL> select name from test where id in(12,13);NAME
    --------------------
    hl2322
    12hhidSQL>
      

  2.   

    你没有明白我的意思,简单一些说吧,我想让YY1000这个串做一个算术运算,加1等于YY1001,而减1等于YY999字母不变,对数字做算术运算
      

  3.   

    可是你给出的例子是“1122AF减1得到1122AE”
      

  4.   

    呵呵 love_2008(找DBA方面的工作中) 的方法应该是“曲线救国”
    不过似乎再考虑一下末位是0的情况就好了
      

  5.   

    如果你要实现很复杂的运算的话,那就要把很多东西都考虑进去了。
    例如四舍五入,若是那样的话  可能会比较麻烦写PLSQL都要写很多  都未必能够考虑全你可以把自己的需求好好整理下  然后在发上来其实若是写PLSQL的话 就和编程没有什么区别,你若是了解SQL的函数的话 就可以自己动手去写了。
      

  6.   

    和业务确认了一下,现在我就只有一个要求了:
    前面是字母,后面是数字,加减只对数字如:YY1000加减1后就为:YY1001,YY999这样应该明确些了
      

  7.   


    SQL> select substr(name,1,length(rtrim(name,'0123456789')))||
      2  to_char(to_number(substr(name,length(rtrim(name,'0123456789')) +1))-1) from a
      3  ;SUBSTR(NAME,1,LENGTH(RTRIM(NAME,'0123456789')))||TO_CHAR(TO_NUMBER(SUBSTR(NAME,L
    --------------------------------------------------------------------------------
    df3222
    ef907
    c99SQL> select name from a;NAME
    --------------------
    df3223
    ef908
    c100SQL> 大致就是这样   然后就需要自己对特殊情况进行改进了
      

  8.   

    非常感谢啊那对于是纯数字串的情况这个能不能加在一个SQL中进行呢
      

  9.   

    写一个函数,就方便在一个SQL语句中使用了.
    create or replace function mySub(str varchar2) return varchar2
    is
      sstr varchar2(16);
      ilen integer;
      itemp integer;
      ichar varchar2(1);
    begin
      ilen:=length(str);
      sstr:='';
      for i in 0..ilen loop
        ichar:=substr(str,ilen-i,1);
        itemp:=i;
        if ascii(ichar)>=ascii('0') and ascii(ichar)<=ascii('9') then
           sstr:=concat(ichar,sstr);
        else
           exit;
        end if;
      end loop;
       sstr:=to_char(to_number(sstr)-1);
       sstr:=concat(substr(str,ilen-itemp,length(str)-length(sstr)),sstr);
      return sstr;
    end;--测试: select mySub('a001') from dual;
      

  10.   

    倒数第二句错了,
    应该是:concat(substr(str,1,ilen-itemp),sstr);
      

  11.   

    转换成10进制,再减,再转换成16进制-----十六进制转换十进制-----------------
      select sum(data1)
        from (select (CASE upper(substr('1122AF', rownum, 1))
                       WHEN 'A' THEN '10'
                       WHEN 'B' THEN '11'
                       WHEN 'C' THEN '12'
                       WHEN 'D' THEN '13'
                       WHEN 'E' THEN '14'
                       WHEN 'F' THEN '15'
                       ELSE substr('1122AF', rownum, 1)
                     END) * power(16, length('1122AF') - rownum) data1
                from dual
              connect by rownum <= length('1122AF'))
      

  12.   

    love_2008(找DBA方面的工作中) 能不能改进一下支持数字串会不会很麻烦
      

  13.   

    那样就只有加一个WHERE 条件来判断是数字串还是混合串
    然后用UNION来把他们在联合起来就可以了大部分的函数也就上面的那么几个  用法几乎相同,你自己研究下吧自己研究出来的东西记得扎实  如果在遇到什么问题 在问