oracle小知識點4--利用將欄位拆分成多個屬性實現order by複雜排序
工作偏運維DBA,所以效能最佳化的sql問題比較多,但功能實現的sql問題比較少.今天遇到一個使用者功能實現的sql問題,簡單但比較有意思.
貼出來分享給大家.
問題:
假設資料庫中存在使用者 q, qa, qq, qaq, qaaaaaaaaaa, aq, aqa, aqq, aaq。
在輸入搜尋框輸入一個 q,則顯示結果應為:
(1)q
(2)qa
(3)qq
(4)qaq
(5)qaaaaaaaaaa
(6)aq
(7)aqa
(8)aqq
(9)aaq
說明:處理順序根據數字的從小到大,從先到後:
1. 全文匹配。[(1)排在最前]
2. 結果與輸入內容從前向後開始比對,開始相同字元位越靠前,越排在前面。[(2)(3)(4)(5)在(6)(7)(8)前,(6)(7)(8)在(9)前]
3. 看字元相同位後面的字元位數,字元位數少的排前面。[(2)(3)在(4)前,(4)在(5)前,同理(6)在(7)前]
4. 字元位數相同時,看字元對應 ASC 碼,小的排前面。[(2)在(3)前,同理(7)在(8)前]
處理:
--產生測試資料
create table scott.testorder
as select 'q' x from dual
union all select 'qa' from dual
union all select 'qq' from dual
union all select 'qaq' from dual
union all select 'qaaaaaaaaaa' from dual
union all select 'aq' from dual
union all select 'aqa' from dual
union all select 'aqq' from dual
union all select 'abq' from dual
union all select 'acq' from dual
union all select 'acqb' from dual;
--查詢實現
select x
from scott.testorder
where x like '%q%'
order by
nvl(length(substr(x,0,instr(x,'q')-1)),0),
substr(x,0,instr(x,'q')-1),
nvl(length(substr(x,instr(x,'q')+1,length(x))),0),
substr(x,instr(x,'q')+1,length(x));
/*
X
q
qa
qq
qaq
qaaaaaaaaaa
aq
aqa
aqq
abq
acq
acqb
*/
解釋:
--以下檢視排序列的值
select x,
nvl(length(substr(x,0,instr(x,'q')-1)),0) "左邊有幾個字元",
substr(x,0,instr(x,'q')-1) "左邊的字串",
nvl(length(substr(x,instr(x,'q')+1,length(x))),0) "右邊有幾個字元",
substr(x,instr(x,'q')+1,length(x)) "右邊的字串"
from scott.testorder
where x like '%q%'
order by
nvl(length(substr(x,0,instr(x,'q')-1)),0),
substr(x,0,instr(x,'q')-1),
nvl(length(substr(x,instr(x,'q')+1,length(x))),0),
substr(x,instr(x,'q')+1,length(x));
/*
X 左邊有幾個字元 左邊的字串 右邊有幾個字元 右邊的字串
q 0 0
qa 0 1 a
qq 0 1 q
qaq 0 2 aq
qaaaaaaaaaa 0 10 aaaaaaaaaa
aq 1 a 0
aqa 1 a 1 a
aqq 1 a 1 q
abq 2 ab 0
acq 2 ac 0
acqb 2 ac 1 b
*/
把x拆分出4個屬性,
order by 中nvl(length(substr(x,0,instr(x,'q')-1)),0)取第一個匹配字串的左邊有幾個字元",
substr(x,0,instr(x,'q')-1) 取第一個匹配字串的左邊的字串,
nvl(length(substr(x,instr(x,'q')+1,length(x))),0) 取第一個匹配字串的右邊有幾個字元,
substr(x,instr(x,'q')+1,length(x)) 取第一個匹配字串的右邊的字串,
然後按這4個屬性排序就可得出想要的順序.
貼出來分享給大家.
問題:
假設資料庫中存在使用者 q, qa, qq, qaq, qaaaaaaaaaa, aq, aqa, aqq, aaq。
在輸入搜尋框輸入一個 q,則顯示結果應為:
(1)q
(2)qa
(3)qq
(4)qaq
(5)qaaaaaaaaaa
(6)aq
(7)aqa
(8)aqq
(9)aaq
說明:處理順序根據數字的從小到大,從先到後:
1. 全文匹配。[(1)排在最前]
2. 結果與輸入內容從前向後開始比對,開始相同字元位越靠前,越排在前面。[(2)(3)(4)(5)在(6)(7)(8)前,(6)(7)(8)在(9)前]
3. 看字元相同位後面的字元位數,字元位數少的排前面。[(2)(3)在(4)前,(4)在(5)前,同理(6)在(7)前]
4. 字元位數相同時,看字元對應 ASC 碼,小的排前面。[(2)在(3)前,同理(7)在(8)前]
處理:
--產生測試資料
create table scott.testorder
as select 'q' x from dual
union all select 'qa' from dual
union all select 'qq' from dual
union all select 'qaq' from dual
union all select 'qaaaaaaaaaa' from dual
union all select 'aq' from dual
union all select 'aqa' from dual
union all select 'aqq' from dual
union all select 'abq' from dual
union all select 'acq' from dual
union all select 'acqb' from dual;
--查詢實現
select x
from scott.testorder
where x like '%q%'
order by
nvl(length(substr(x,0,instr(x,'q')-1)),0),
substr(x,0,instr(x,'q')-1),
nvl(length(substr(x,instr(x,'q')+1,length(x))),0),
substr(x,instr(x,'q')+1,length(x));
/*
X
q
qa
qaq
qaaaaaaaaaa
aq
aqa
aqq
abq
acq
acqb
*/
解釋:
--以下檢視排序列的值
select x,
nvl(length(substr(x,0,instr(x,'q')-1)),0) "左邊有幾個字元",
substr(x,0,instr(x,'q')-1) "左邊的字串",
nvl(length(substr(x,instr(x,'q')+1,length(x))),0) "右邊有幾個字元",
substr(x,instr(x,'q')+1,length(x)) "右邊的字串"
from scott.testorder
where x like '%q%'
order by
nvl(length(substr(x,0,instr(x,'q')-1)),0),
substr(x,0,instr(x,'q')-1),
nvl(length(substr(x,instr(x,'q')+1,length(x))),0),
substr(x,instr(x,'q')+1,length(x));
/*
X 左邊有幾個字元 左邊的字串 右邊有幾個字元 右邊的字串
q 0 0
qa 0 1 a
qq 0 1 q
qaq 0 2 aq
qaaaaaaaaaa 0 10 aaaaaaaaaa
aq 1 a 0
aqa 1 a 1 a
aqq 1 a 1 q
abq 2 ab 0
acq 2 ac 0
acqb 2 ac 1 b
*/
把x拆分出4個屬性,
order by 中nvl(length(substr(x,0,instr(x,'q')-1)),0)取第一個匹配字串的左邊有幾個字元",
substr(x,0,instr(x,'q')-1) 取第一個匹配字串的左邊的字串,
nvl(length(substr(x,instr(x,'q')+1,length(x))),0) 取第一個匹配字串的右邊有幾個字元,
substr(x,instr(x,'q')+1,length(x)) 取第一個匹配字串的右邊的字串,
然後按這4個屬性排序就可得出想要的順序.
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-1781261/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 快排實現仿order by多欄位排序排序
- MySql Order By 多個欄位 排序規則MySql排序
- Oracle如何實現多個欄位去重Oracle
- 利用 alter 語句修改欄位屬性
- C 語言複雜知識點
- LINQ 按多個欄位排序排序
- C# 實現list=list.OrderBy(q=>q.欄位名).ToList(); 按多個欄位排序C#排序
- 一句話實現欄位拆分成多行
- 雜湊表知識點小結
- oracle小知識點6--oracle dml觸發器的fire_once_only屬性Oracle觸發器
- 將多個JSON欄位對映到單個Java欄位JSONJava
- JavaWeb複習小知識點(一)JavaWeb
- PHP陣列多個欄位分別排序PHP陣列排序
- oracle複合索引介紹(多欄位索引)Oracle索引
- MySQL 變數 、rownum 、 一行拆多行..小知識點MySql變數
- SQL字元型欄位按數字型欄位排序實現方法SQL字元排序
- python複習。知識點小記Python
- javascript中關於value的一個小知識點(value既是屬性也是變數)JavaScript變數
- Android小知識-利用OkHttp實現WebSocket通訊AndroidHTTPWeb
- odoo欄位屬性列舉Odoo
- C#屬性與欄位C#
- c# saf 框架欄位屬性多層巢狀示例C#框架巢狀
- webpack 拆包:關於 splitChunks 的幾個重點屬性解析Web
- oracle事務知識點小結Oracle
- oracle小知識點9--cluvfyOracle
- Spring MVC @SortDefault多欄位排序SpringMVC排序
- 如何利用BAPI SD_SALESDOCUMENT_CHANGE修改Sales Order的欄位API
- 共有的表單欄位屬性
- Scala的類、屬性、物件欄位物件
- 查詢/刪除重複的資料(單個欄位和多個欄位條件)
- Generator知識點雜燴
- [譯] Font-size:一個意外複雜的 CSS 屬性CSS
- oracle:聯表更新多個欄位的值Oracle
- 欄位排序排序
- ORACLE多欄位CASE WHENOracle
- Oracle_day1(小知識點)Oracle
- [提問交流]建立模型,新增屬性,欄位型別如何設定2位小數的欄位型別模型型別
- iOS 實現多個可變 cell 複雜介面的製作iOS