当前位置: 代码迷 >> Oracle开发 >> sql按规约转换数字查询结果
  详细解决方案

sql按规约转换数字查询结果

热度:81   发布时间:2016-04-24 06:49:15.0
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;
    return v_ret;
    exception
    when others then
      begin
      return '程序异常';
      end;
  end;

测试,键盘输入第一个参数:
SQL> select test_ff(&a,'2378') from dual;
 
TEST_FF(1,'2378')
--------------------------------------------------------------------------------
6712
 
SQL> 

------解决方案--------------------

 WITH TA AS
  (SELECT 4 KEY FROM DUAL   UNION ALL 
   SELECT 5 KEY FROM DUAL
   ),
 TB AS
  (SELECT '2378' AS SA FROM DUAL),
 
 TC AS
  (SELECT LEVEL LV
     FROM DUAL
   CONNECT BY LEVEL <= (SELECT MAX(LENGTH(SA)) FROM TB))
 SELECT KEY, SA, REPLACE(WM_CONCAT(MOD(SUBSTR(SA, LV, 1) + KEY, 10)), ',', '') RESULT
   FROM TA, TB, TC
  WHERE LENGTH(SA) >= LV
  GROUP BY KEY, SA

------
KEY SA RESULT
4 2378 6712
5 2378 7823
  相关解决方案