|
居然有不同路径可以得到同一个值....
WITH p AS (
SELECT pos,l
FROM (SELECT ROWNUM pos FROM DUAL CONNECT BY ROWNUM<=10),(SELECT ROWNUM l FROM DUAL CONNECT BY ROWNUM<=3)
)
,t (str,len,path) AS (
/*SELECT REPLACE(SYS_CONNECT_BY_PATH(n,','),',') ,LEVEL,''
FROM (SELECT ROWNUM-1 n FROM DUAL CONNECT BY ROWNUM<=10)
START WITH n>0
CONNECT BY NOCYCLE LEVEL<=3
*/
select a,length(a),'' from (select to_char(level,'fm999') a from dual connect by level<=999)
where a<=9
or(a>=10 and a<=99 and mod(a,11)>0)
or(a>=100 and (substr(a,1,1)<>substr(a,2,1) and substr(a,1,1)<>substr(a,3,1) and substr(a,3,1)<>substr(a,2,1)))
UNION ALL
SELECT SUBSTR(str,1,pos-1)||TO_CHAR(SUBSTR(str,pos,l)*SUBSTR(str,pos,l))||SUBSTR(str,pos+l)
,LENGTH(SUBSTR(str,1,pos-1)||TO_CHAR(SUBSTR(str,pos,l)*SUBSTR(str,pos,l))||SUBSTR(str,pos+l))
,path||SUBSTR(str,1,pos-1)||'('||SUBSTR(str,pos,l)||')'||SUBSTR(str,pos+l)||','
FROM t,p
WHERE pos+l-1<=t.len and substr(SUBSTR(str,pos,l),-1)<>'0' and SUBSTR(str,p.pos,p.l)>'1'
--and t.len-l+LENGTH(TO_CHAR(SUBSTR(str,pos,l)*SUBSTR(str,pos,l)))<=10
and
case when SUBSTR(str,pos,l) <=3 then 0
when SUBSTR(str,pos,l)<=31 then 1
when SUBSTR(str,pos,l)<=316 then 2
else 3
end + len<=10
AND LENGTH(TRANSLATE('1234567890','$'||SUBSTR(str,1,pos-1)||TO_CHAR(SUBSTR(str,pos,l)*SUBSTR(str,pos,l))||SUBSTR(str,pos+l),'$'))
= 10 - LENGTH(SUBSTR(str,1,pos-1)||TO_CHAR(SUBSTR(str,pos,l)*SUBSTR(str,pos,l))||SUBSTR(str,pos+l))
)
CYCLE str SET cycle_flag TO 'Y' DEFAULT 'N'
SELECT path||str FROM (
SELECT * FROM t ORDER BY len DESC,str DESC
)
WHERE ROWNUM=1;
PATH||STR
-----------------------------------------------------------------------------
----------------
38(7),38(49),(3)82401,98(24)01,98(5)7601,98(2)57601,98457(6)01,984573601
已用时间: 00: 00: 50.40
/*+rule*/
PATH||STR
---------------------------------------------------------------------------
----------------
38(7),38(49),38(24)01,(3)857601,9857(6)01,98(5)73601,98(2)573601,984573601
已用时间: 00: 00: 49.67
SQL> 19
19* FROM t,p
SQL> c/t,p/p,t
19* FROM p,t
SQL> /
PATH||STR
---------------------------------------------------------------------------------
----------------
38(7),38(49),(3)82401,98(24)01,98(5)7601,98(2)57601,98457(6)01,984573601
已用时间: 00: 00: 59.26 |
|