Oracle中對數字加漢字的排序
阿新 • • 發佈:2020-07-21
需求:有一列NAME, varchar2型別,內容如下
以上就是已經按order by name進行排序的,但不是我們想要的結果
現在需要只按數字進行排序
第一步:抽取數字
由於數字有是一位的有是兩位的 所以不好用substr進行擷取
我們可以使用REGEXP_SUBSTR函式,使用正則表示式從字串中抽取子串。
[sql]view plaincopy- REGEXP_SUBSTR(name,'[0-9]+')
第二步、將varchar型別的數字轉換為int型別的數字
-
cast(yourcolasint)
可參考:sql中,把varchar型別轉換為int型,然後進行排序
所以結合起來
[sql]view plaincopy- select*fromtestorderbycast(REGEXP_SUBSTR(name,'[0-9]+')asint);
就可以按數字進行排序了
後來在開發的過程中又遇到類似問題,資料不一樣了,按之前的用法是不適用的。
之前的是數字在前漢字在後,最主要的區別是數字沒有重複的,而現在的資料中數字是有重複的
比如:
- 玫瑰園1樓
- 玫瑰園2樓
- 興帝家園1樓
- 興帝家園2樓
- 1
- 2
- 3
- 4
- 1
- 2
- 3
- 4
如果是隻抽取數字進行排序 會造成兩個1樓在前 兩個2樓在後
而想要的結果是先按相同的名字排序 再按樓號排序
第一步:擷取漢字
只擷取正則表示式中漢字首次出現的位置(下同)
REGEXP_SUBSTR(name, '[[:alpha:]]+')
- 1
- 1
第二步:擷取數字
REGEXP_SUBSTR(name, '[0-9]+')
- 1
- 1
第三步:ORDER BY排序
先按漢字進行排序,相同的再按數字排序
- SELECT * FROM ADDRESS_TREE
-
order by REGEXP_SUBSTR(name, '[[:alpha:]]+'), --漢字排序
- cast(REGEXP_SUBSTR(name, '[0-9]+') as int); --數字排序
- 1
- 2
- 3
- 1
- 2
- 3