需求:有一列name, varchar2型別,內容如下
以上就是已經按order by name進行排序的,但不是我們想要的結果
現在需要只按數字進行排序
第一步:抽取數字
由於數字有是一位的有是兩位的 所以不好用substr進行擷取
我們可以使用regexp_substr函式,使用正規表示式從字串中抽取子串。
[sql]view
plain
copy
regexp_substr(name, '[0-9]+')
第二步、將varchar型別的數字轉換為int型別的數字
[sql]view
plain
copy
cast(yourcol asint)
可參考:sql中,把varchar型別轉換為int型,然後進行排序
所以結合起來
[sql]view
plain
copy
select* fromtest orderbycast(regexp_substr(name, '[0-9]+') asint);
就可以按數字進行排序了
後來在開發的過程中又遇到類似問題,資料不一樣了,按之前的用法是不適用的。
之前的是數字在前漢字在後,最主要的區別是數字沒有重複的,而現在的資料中數字是有重複的
比如:玫瑰園1樓
玫瑰園2樓
興帝家園1樓
興帝家園2樓
如果是只抽取數字進行排序 會造成兩個1樓在前 兩個2樓在後
而想要的結果是先按相同的名字排序 再按樓號排序
只擷取正規表示式中漢字首次出現的位置(下同)
regexp_substr(name, '[[:alpha:]]+')
regexp_substr(name, '[0-9]+')
先按漢字進行排序,相同的再按數字排序
select * from address_tree
order by regexp_substr(name, '[[:alpha:]]+'), --漢字排序
cast(regexp_substr(name, '[0-9]+') as int); --數字排序
Oracle中對資料行數的操作
有如下資料庫定義 資料庫名稱 td order liu列名 訂貨號,商品名,顯示號碼 其中顯示號碼並不是連續的 1,2,3 n 也就是說並非直接代表了那一行的位置。現在,要實現如下兩個功能 1,資料按照 顯示號碼 排序後,選取第 n行資料 sql select from select 訂貨號,商品名...
Oracle 中序號含有數字,特殊字元組合排序
在工作中碰到按某個序號字段排序,序號含有數字,數字和特殊字元的組合排序,詳情如下圖所示 解決思路方法 將序號按特殊符合 拆分為兩個部分,之前為乙個欄位before num,之後的為另乙個欄位behind num,利用substr 和instr 函式擷取對應的字元,若把10排在9的後面,還需要在按長度...
Oracle中對資料表的各種操作
create table create table fb currency currency code varchar2 40 not null,currency name varchar2 40 s cmpy varchar2 40 s tdept varchar2 40 s tname varc...