如何实现查询语句中减1的操作,具体请进
我有一个字段是由英文和字母组成的,如:BA12345或是1122AF,在查询中,我需要做的是得到BA12345减1后的数,即为BA12344,同样,1122AF减1得到1122AE
有没有什么办法用SQL能够实现这个
------解决方案--------------------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
12hhic
SQL> select name from test where id in(12,13);
NAME
--------------------
hl2322
12hhid
SQL>
------解决方案--------------------写一个函数,就方便在一个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进制,再减,再转换成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 '))