日常工作中,我們可能會碰見比較特殊的數據,比如數組和字母摻雜的情況,我們也要對他們進行排序,並且按照我們想要的方式排序下來:接下來我就要介紹的是我碰見的情況,並考慮如何優化的,因爲是公司的數據,我就不貼圖了,我把大致的類型弄出來,記錄一下,以備將來用得上。
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)
完美解決,真是方便舒心。