ORACLE最值函数取不到正确值?也许是decode的问题

       最近有个业务需求,某个表字段取除0和空值之外的最大最小值,因为同一表中还有其他字段要进行计算,所以不能直接过滤数据。这个也简单,min()/max()函数不计算空值,那直接对这个字段decode一下不就行了嘛,嘿嘿嘿。想起来超级简单,没想到做出来却是挖了个坑,看下面的例子:

with aa as
(
select 7100.000  nmb from dual union all
select 7100.000  nmb from dual union all
select 10325.000 nmb from dual union all
select 2560.000  nmb from dual union all
select 2666.760  nmb from dual union all
select 5626.880  nmb from dual union all
select 0.000     nmb from dual union all
select null from dual union all
select 10310.630 from dual
)
select min(decode(aa.nmb,0,null,aa.nmb)) de_min_nmb
       ,max(decode(aa.nmb,0,null,aa.nmb)) de_max_nmb
       ,min(case when aa.nmb <> 0 then aa.nmb else null end) case_min_nmb
       ,max(case when aa.nmb <> 0 then aa.nmb else null end) case_max_nmb
from aa
;

运行SQL,得到的结果是这样的:

      可以看出,decode函数处理出来的结果是错误的,case when 方式处理的结果才是需要的结果。(⊙o⊙)…至于原理,百度也好问朋友也好,都没得到满意的答案。若是哪位大神知道原因,麻烦告知一下,不胜感激~~~

 

 

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值