Oracle中對數字加漢字的排序


需求:有一列NAME, varchar2類型,內容如下

以上就是已經按order by name進行排序的,但不是我們想要的結果

現在需要只按數字進行排序


第一步:抽取數字
由於數字有是一位的有是兩位的 所以不好用substr進行截取

我們可以使用REGEXP_SUBSTR函數,使用正則表達式從字符串中抽取子串。

 

[sql]  view plain  copy
 
  在CODE上查看代碼片派生到我的代碼片
  1. REGEXP_SUBSTR(name'[0-9]+')  


第二步、將varchar類型的數字轉換為int類型的數字

 

 

[sql]  view plain  copy
 
  在CODE上查看代碼片派生到我的代碼片
  1. cast(yourcol as int)  

可參考:sql中,把varchar類型轉換為int型,然后進行排序

 


所以結合起來

 

[sql]  view plain  copy
 
  在CODE上查看代碼片派生到我的代碼片
  1. select * from test order by cast(REGEXP_SUBSTR(name'[0-9]+'as int);  

就可以按數字進行排序了

 


后來在開發的過程中又遇到類似問題,數據不一樣了,按之前的用法是不適用的。

之前的是數字在前漢字在后,最主要的區別是數字沒有重復的,而現在的數據中數字是有重復的

比如:

  1. 玫瑰園1樓
  2. 玫瑰園2樓
  3. 興帝家園1樓
  4. 興帝家園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排序

先按漢字進行排序,相同的再按數字排序

  1. SELECT * FROM ADDRESS_TREE
  2. order by REGEXP_SUBSTR(name, '[[:alpha:]]+'), --漢字排序
  3. cast(REGEXP_SUBSTR(name, '[0-9]+') as int); --數字排序
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

這里寫圖片描述


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM