有表A(pid,operator,fee)
值如下:
5 < 100
7 = 200
10 > 300
表B(pid,pname)
1 tom
2 jack
3 rose
5 mike
6 david
7 owen
10 bill
11 raul要求,就是如果pid的值<5,就返回100;=7,就返回200;>10,就返回300; 其他值就返回0;
也就是两表关联,查询到的最后结果如下:
1 tom 100
2 jack 100
3 rose 100
5 mike 0
6 david 0
7 owen 200
10 bill 0
11 raul 300
值如下:
5 < 100
7 = 200
10 > 300
表B(pid,pname)
1 tom
2 jack
3 rose
5 mike
6 david
7 owen
10 bill
11 raul要求,就是如果pid的值<5,就返回100;=7,就返回200;>10,就返回300; 其他值就返回0;
也就是两表关联,查询到的最后结果如下:
1 tom 100
2 jack 100
3 rose 100
5 mike 0
6 david 0
7 owen 200
10 bill 0
11 raul 300
解决方案 »
- 创建表格时出现文字与格式字符串不匹配
- Oracle新手问题
- oralce 删除表 要求恢复
- 请问:运行oracle数据库,对服务器硬件需求是什么样的?对cpu要求高还是对内存要求高?
- 急!!!!!!!!!!!!oracle存储过程
- 一条简单的语句oracle语句
- 请问select sum(kk) as mm from table where mm<'88'这句sql对吗??
- 为什么我在中文linux9下的oracle安装界面是乱吗
- 求一条SQL语句。(此问题对高手来说是个简单问题,up者有分)
- oracleremexecservicev2服务无法启动
- 触发器实现同步
- 想学习Oracle,请介绍下有什么好书?
但这个结果不是我想要的。
希望能有其他的解决办法。
写个函数来处理
create table a as select 5 pid,'<' operator,100 fee from dual
union all select 7,'=',200 from dual
union all select 10,'>',300 from dual;
create table b as select 1 pid,'tom' pname from dual
union all select 2,'jack' from dual
union all select 3,'rose' from dual
union all select 5,'mike' from dual
union all select 6,'david' from dual
union all select 7,'owen' from dual
union all select 10,'bill' from dual
union all select 11,'raul' from dual;
函数
create or replace function func(num1 in number,
operator in varchar2,
num2 in number)
return number as
flag number;
begin
execute immediate 'select case when '||num1||operator||num2||' then 1 else 0 end'||chr(13)||
'from dual' into flag;
return flag;
end;
查询
select b.pid,b.pname,nvl(a.fee,0)
from a,b
where func(b.pid,a.operator(+),a.pid(+))=1
结果
PID PNAME NVL(A.FEE,0)
1 tom 100
2 jack 100
3 rose 100
5 mike 0
6 david 0
7 owen 200
10 bill 0
11 raul 300
max(decode(a.operator,'<',decode(sign(c.rn - a.pid),-1,a.fee,0),
'=',decode(sign(c.rn - a.pid),0,a.fee,0),
'>',decode(sign(c.rn - a.pid),1,a.fee,0))) fee
from
a, b,
( select level rn
from
dual t,
( select min(pid) minpid, max(pid) maxpid from b ) u
where level >= u.minpid connect by level <= maxpid ) c
where b.pid = c.rn
group by b.pid,b.pname;
你的做法看起来简单,却很适用。
我最终采取你的方法,不灵活,但是性能够好。
不过wildwave的方法更灵活些,只是性能有些跟不上。