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