|
想不到整数运算比字符快那么多
with a as(select level-1 a from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g as(select * from(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
power(10,e.b1)+power(10,f.b1)s1,
power(10,e.b2)+power(10,f.b2)s2,
power(10,e.b3)+power(10,f.b3)s3,
power(10,e.b4)+power(10,f.b4)s4
from e,e f)
where instr(b1||b2||b3||b4,'00') not in(1,3,5,7)) ,
h as(select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
s1+power(10,f.b1)s1,
s2+power(10,f.b2)s2,
s3+power(10,f.b3)s3,
s4+power(10,f.b4)s4
from g e,e f)x
--where substr(s1,1,1)>=substr(s1,3,1) and substr(s2,1,1)>=substr(s2,3,1) and substr(s3,1,1)>=substr(s3,3,1) and substr(s4,1,1)>=substr(s4,3,1)
),
j as (select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
s1+power(10,f.b1)s1,
s2+power(10,f.b2)s2,
s3+power(10,f.b3)s3,
s4+power(10,f.b4)s4
from h e,e f)x
where substr(s1,1,1)>substr(s1,3,1) and substr(s2,1,1)>substr(s2,3,1) and substr(s3,1,1)>substr(s3,3,1) and substr(s4,1,1)>substr(s4,3,1))
select count(*) from j;
COUNT(*)
----------
294879
已用时间: 00: 00: 07.22
----------------
with a as(select level-1 a,level-2 b from dual connect by level<=3),
e as(select a.a||b.a||c.a||d.a p,a.a b1,b.a b2,c.a b3,d.a b4,a.b s1,b.b s2,c.b s3,d.b s4
from a,a b,a c,a d
where regexp_count(a.a||b.a||c.a||d.a,'2')>regexp_count(a.a||b.a||c.a||d.a,'0')),
g as(select * from(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from e,e f)
where instr(b1||b2||b3||b4,'00') not in(1,3,5,7)) ,
h as(select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from g e,e f)x
),
j as (select * from
(select e.p||f.p p,e.b1||f.b1 b1,e.b2||f.b2 b2,e.b3||f.b3 b3,e.b4||f.b4 b4 ,
e.s1+f.s1 s1,
e.s2+f.s2 s2,
e.s3+f.s3 s3,
e.s4+f.s4 s4
from h e,e f)x
where s1>0 and s2>0 and s3>0 and s4>0)
select count(*) from j;
COUNT(*)
----------
294879
已用时间: 00: 00: 00.84 |
|