需求:有一列NAME, varchar2類型,內容如下
以上就是已經按order by name進行排序的,但不是我們想要的結果
現在需要只按數字進行排序
第一步:抽取數字
由於數字有是一位的有是兩位的 所以不好用substr進行截取
我們可以使用REGEXP_SUBSTR函數,使用正則表達式從字符串中抽取子串。
- REGEXP_SUBSTR(name, '[0-9]+')
第二步、將varchar類型的數字轉換為int類型的數字
- cast(yourcol as int)
可參考:sql中,把varchar類型轉換為int型,然后進行排序
所以結合起來
- select * from test order by cast(REGEXP_SUBSTR(name, '[0-9]+') as int);
就可以按數字進行排序了
后來在開發的過程中又遇到類似問題,數據不一樣了,按之前的用法是不適用的。
之前的是數字在前漢字在后,最主要的區別是數字沒有重復的,而現在的數據中數字是有重復的
比如:
-
玫瑰園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