需求:对如下数据排序:
思路一:将字母转成ASCII码值进行排序
(最开始想到的这个思路,但该方法待优化!!!)
ORDER BY CASE WHEN ASCII(字段) < 58 THEN TO_NUMBER(字段) ELSE ASCII(字段) END
[0-9]
的ASCII码值为[48-57]
[A-Z]
的ASCII码值为[65-90]
[a-z]
的ASCII码值为[97-122]
这里直接判断小于58就认为是数字,数字时取数值,数字大于65时就会和字母冲突,当前业务中数字最大为20(无小写字母)
,暂且可以满足需求(有小写时小写也会排在大写的后面)
。
思路二:是数字时就转化为数值排序,再根据字母排序
(推荐使用该方法!!!)
order by to_number(regexp_substr(字段, '^\d+', 1)), 字段
注:排序字段有两个,数字时根据数值排序,不是数字时再根据原字符排序