oracle如何实现三个数比较,取最大值

大漠明月 2008-09-22 03:52:40
有这样一张表M ,里面有三个字段分别为 a b c,这三个字段有可能其中一个为空值,或者其中两个为空值,再或者全部都为空值 三种情况;该采用什么方法来判断三个值取最大的那一个?
说明:这三个字段都是char类型的;
...全文
2408 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xffangbin 2011-04-27
  • 打赏
  • 举报
回复
good,正需要,找了半天
大漠明月 2008-09-22
  • 打赏
  • 举报
回复
三个字段如果有1个或两个字段为空的情况下用greatest()好象不行啊!!!
而且还有这么个问题:同一个id的记录有多条数据的情况
ghtghtmalone 2008-09-22
  • 打赏
  • 举报
回复
select greatest(1,2,3) from dual
大漠明月 2008-09-22
  • 打赏
  • 举报
回复
不好意思,刚才没说清楚,我是想用一条sql语句来实现,我自己用decode实现了一个,可不敢保证逻辑上完全正确
select
m.id,
decode(sign(decode(sign(m.a-m.b),1, m.a, m.b) - m.c),1,decode(sign(m.a-m.b),1,m.a,m.b),m.c) num
from
M m
where
m.empid
not in(
select
e.id
from
M e
where e.a is null
and e.b is null
and e.c is null
)
我把三个都为空的过滤掉,然后进行比较;不知道这样行不行,如果不行的话该怎么写呢?请高手指点指点...
kinlin 2008-09-22
  • 打赏
  • 举报
回复
错了,改一下
trim(GREATEST(lpad(' ' || a,20,' '),lpad(' ' || b,20,' '),lpad(' ' || c,20 ,' ')))
kinlin 2008-09-22
  • 打赏
  • 举报
回复
trim(GREATEST(lpad(a,20,' '),lpad(b,20,' '),lpad(c,20 ,' ')))
cosio 2008-09-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hebo2005 的回复:]
greatest(a,b,c)
[/Quote]

select greatest(1,2,3) from dual

result:

3
hebo2005 2008-09-22
  • 打赏
  • 举报
回复
SELECT deminid,ammountid,ammountvalue,
greatest(deminid,ammountid,ammountvalue)

FROM test1


就能达到4楼的效果再多列,也就往里面填字段而已
hebo2005 2008-09-22
  • 打赏
  • 举报
回复
greatest(a,b,c)
ghtghtmalone 2008-09-22
  • 打赏
  • 举报
回复
SELECT deminid,ammountid,ammountvalue FROM test1

DEMINID AMMOUNTID AMMOUNTVALUE
1 1 1 2
2 1 3 4
3 1 5 6


SELECT deminid,ammountid,ammountvalue,
(CASE WHEN (CASE WHEN deminid-ammountid >0 THEN deminid ELSE ammountid END) - ammountvalue >0 THEN CASE WHEN deminid-ammountid >0 THEN deminid ELSE ammountid END
ELSE ammountvalue END)MAXVALUES
FROM test1
DEMINID AMMOUNTID AMMOUNTVALUE MAXVALUES
1 1 1 2 2
2 1 3 4 4
3 1 5 6 6
ghtghtmalone 2008-09-22
  • 打赏
  • 举报
回复
SELECT deminid,ammountid,ammountvalue,
(CASE WHEN (CASE WHEN nvl(a,0)-nvl(b,0) >0 THEN nvl(a,0) ELSE nvl(b,0)END) - nvl(c,0)>0 THEN (CASE WHEN nvl(a,0)-nvl(b,0) >0 THEN nvl(a,0) ELSE nvl(b,0)END
ELSE nvl(c,0)> END)
FROM m
范佩西_11 2008-09-22
  • 打赏
  • 举报
回复
用nvl转换把空值为0;
max:=a
if a<b then
max:=b;
end if;
if max <c then
max:=c;
end if;

ghtghtmalone 2008-09-22
  • 打赏
  • 举报
回复
nvl(字段,0)
把为空的字段变成0 再比较

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧