最近有个业务需求,某个表字段取除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⊙)…至于原理,百度也好问朋友也好,都没得到满意的答案。若是哪位大神知道原因,麻烦告知一下,不胜感激~~~