1. 程式人生 > 實用技巧 >Oracle中對數字加漢字的排序

Oracle中對數字加漢字的排序

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

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

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


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

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

[sql]view plaincopy
  1. REGEXP_SUBSTR(name,'[0-9]+')


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

[sql]view plaincopy
  1. cast(yourcolasint)

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


所以結合起來

[sql]view plaincopy
  1. select*fromtestorderbycast(REGEXP_SUBSTR(name,'[0-9]+')asint);

就可以按數字進行排序了


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

之前的是數字在前漢字在後,最主要的區別是數字沒有重複的,而現在的資料中數字是有重複的

比如:

  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