用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
来自 http://blog.sina.com.cn/s/blog_6ff05a2c0100o424.html
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
来自 http://blog.sina.com.cn/s/blog_6ff05a2c0100o424.html