日常工作中,我们可能会碰见比较特殊的数据,比如数组和字母掺杂的情况,我们也要对他们进行排序,并且按照我们想要的方式排序下来:接下来我就要介绍的是我碰见的情况,并考虑如何优化的,因为是公司的数据,我就不贴图了,我把大致的类型弄出来,记录一下,以备将来用得上。
1、当前缀相同时,例如数据类似A1、A10、A2、A20、B2、B12(开头也不一定是字母,可以是字符串)
假如这一列名称是name_value,我们想要的结果是
A1、A2、A10、A20、B2、B12
如果是直接排序的话,是行不通的,所以我们需要处理一下,先对name_value排序,再对name_value的长度排序。
select name_value from table
order by name_value,length(name_value)
2、当遇到数据类似2A、45A、155A、1.25B、2.5B、10B、50B(此方法适用于尾部必须是字母)
假设这一列名称为name_value,首先先对尾字母排序 用substr函数,substr(name_value, -1)就截取出最后一个字母了对这个进行排序就行了。接着就想办法把这个字母干掉然后接着排序,用这个函数,当然要注意大小写,这个是区分大小写的regexp_replace(name_value,'[A-Z]'),去掉之后排序还是不行的,因为现在的数据不是数字类型,所以这里面的比如处理过后的2与2.5就没法比较出正确的结果,所以还需将处理过的结果转换成数字cast(regexp_replace(name_value,'[A-Z]') as int),
最终是oracle语句是
select name_value from table
order by sybstr(name_value,-1),cast(regexp_replace(name_value,'[A-Z]') as int)
完美解决,真是方便舒心。