Oracle排序时的问题
一、对字段数据时0-220这样数据的排序
select ship_weight from (select case when WEIGHT_TON<5000 then '0-5000'
when WEIGHT_TON>=5000 and WEIGHT_TON<8000 then '5000-8000'
when WEIGHT_TON<12000 and WEIGHT_TON>=8000 then '8000-12000'
when WEIGHT_TON<16000 and WEIGHT_TON>=12000 then '12000-16000'
when WEIGHT_TON<22000 and WEIGHT_TON>=16000 then '16000-22000'
when WEIGHT_TON>=22000 then '22000以上' end ship_weight
from contract_ship) group by ship_weight order by ship_weight asc;
如果这样排序得到的是,默认按字符串的第一个字符的大小排序,这是我不想要的
null最大排在最下面
select ship_weight from (select case when WEIGHT_TON<5000 then ' 0-5000'
when WEIGHT_TON>=5000 and WEIGHT_TON<8000 then ' 5000-8000'
when WEIGHT_TON<12000 and WEIGHT_TON>=8000 then ' 8000-12000'
when WEIGHT_TON<16000 and WEIGHT_TON>=12000 then '12000-16000'
when WEIGHT_TON<22000 and WEIGHT_TON>=16000 then '16000-22000'
when WEIGHT_TON>=22000 then '22000以上' end ship_weight
from contract_ship) group by ship_weight order by ship_weight asc;
根据ASCII 码排序,字符串的首位在ASCII 码表中越小,排序越靠前。
当然我们也可以根据-拆分,转换成(cast)数字,排序
ASCII码参考:https://www.cnblogs.com/Wangwf-net/p/7208546.html
二、关于null
oracle认为 null 最大。
升序排列,默认情况下,null值排后面。
降序排序,默认情况下,null值排前面。
有几种办法改变这种情况:
(1)用 nvl 函数或decode 函数 将null转换为一特定值
(2)用case语法将null转换为一特定值(oracle9i以后版本支持。和sqlserver类似):
order by (case mycol when null then ’天津’ else mycol end)
(3)使用nulls first 或者nulls last 语法。
对null的说明:
1、等价于没有任何值、是未知数。
2、NULL与0、空字符串、空格都不同。
3、对空值做加、减、乘、除等运算操作,结果仍为空。
4、NULL的处理使用NVL函数或者nvl2。
5、比较时使用关键字用“is null”和“is not null”。
6、空值不能被索引,所以查询时有些符合条件的数据可能查不出来,
count(*)中,用nvl(列名,0)处理后再查。
7、排序时比其他数据都大(索引默认是降序排列,小→大),
所以NULL值总是排在最后。
结论:
对null 值的比较只能是is , is not , null通过其他方式和任何值(包括null)的比较结果都是空
对null值的处理可以通过nvl(,)
参考:
https://www.2cto.com/database/201210/159543.html