日期:2014-05-17  浏览次数:20898 次

sql按规则转换数字查询结果
1)    Key is: 4   则
0-4,1-5,2-6,3-7,4-8,5-9,6-0,7-1,8-2,9-3

2)    Key is: 5   则
0-5,1-6,2-7,3-8,4-9,5-0,6-1,7-2
8-3,9-4

比如select 2378 from dual;若按1)    Key is: 4,则返回的结果为6712
若按2)    Key is: 5 ,则返回的结果为7823

如果实现这样的select sql呢,有没有什么函数?
------解决方案--------------------
如果固定位数的话,可以使用字符串结合mod实现,如:
SELECT mod(substr('2378',1,1)+4,10) 
------解决方案--------------------
 
       mod(substr('2378',2,1)+4,10) 
------解决方案--------------------
 
       mod(substr('2378',3,1)+4,10) 
------解决方案--------------------
 
       mod(substr('2378',4,1)+4,10) 
  FROM dual;

SELECT mod(substr('2378',1,1)+5,10) 
------解决方案--------------------
 
       mod(substr('2378',2,1)+5,10) 
------解决方案--------------------
 
       mod(substr('2378',3,1)+5,10) 
------解决方案--------------------
 
       mod(substr('2378',4,1)+5,10) 
  FROM dual;

如果变位数的话,最好自定义个函数
------解决方案--------------------
核心代码如1#
function:
create or replace function test_ff(in_num in varchar2,in_str varchar2)
return varchar2 is
v_ret varchar2(100);
begin
  if in_num = '1' then
    SELECT mod(substr(in_str, 1, 1) + 4, 10) 
------解决方案--------------------

           mod(substr(in_str, 2, 1) + 4, 10) 
------解决方案--------------------

           mod(substr(in_str, 3, 1) + 4, 10) 
------解决方案--------------------

           mod(substr(in_str, 4, 1) + 4, 10) into v_ret
      FROM dual;
    elsif in_num = '2' then
    SELECT mod(substr(in_str, 1, 1) + 5, 10) 
------解决方案--------------------

           mod(substr(in_str, 2, 1) + 5, 10) 
------解决方案--------------------

           mod(substr(in_str, 3, 1) + 5, 10) 
------解决方案--------------------

           mod(substr(in_str, 4, 1) + 5, 10) into v_ret
      FROM dual;
      else
        v_ret :='It is wrong key';
      end if;