[ORACLE]order by desc排序的null空值陷阱

用order by排序时,默认空值放在最后面,但是如果是order by desc ,那么空值默认就是放在最前面:

ETL@RACTEST> select a,rowid from liutest order by a;

         A ROWID
---------- ------------------
         1 AAF0+EAD0AAAGntAAA
         2 AAF0+EAD0AAAGntAAB
           AAF0+EAD0AAAGntAAC

Elapsed: 00:00:00.03
ETL@RACTEST> select a,rowid from liutest order by a desc;

         A ROWID
---------- ------------------
           AAF0+EAD0AAAGntAAC
         2 AAF0+EAD0AAAGntAAB
         1 AAF0+EAD0AAAGntAAA

Elapsed: 00:00:00.01

 

    这是一个小问题,但是在现实应用中如果犯错那就是大问题!试想我要对注册资金(reg_capital)进行从大到小排序,那么如果order by reg_capital desc 中的reg_capital存在空值,那完全就不是按注册资金从大到小排序,是把没有注册资金的全部排在了最前面,这简直就是是非颠倒,黑白不分!

    因此当用order by desc排序时,一定要注意看有没有空值,否则就会产生“想找最好的却找了最差的,想找最多的却找了最少的”这样的效果!

    解决这类问题有两个方法,根据具体需要而定。

1.对空值进行转换处理,例如转换成0

2.排序时使用nulls last关键字,如

ETL@RACTEST> select a,rowid from liutest order by a desc nulls last;

         A ROWID
---------- ------------------
         2 AAF0+EAD0AAAGntAAB
         1 AAF0+EAD0AAAGntAAA
           AAF0+EAD0AAAGntAAC

Elapsed: 00:00:00.01

猜你喜欢

转载自bosschen.iteye.com/blog/1968204