Oracle學習系列—關於字元數字混合排序和中文排序的問題
關於漢字排序的問題源於曾經做過的114號碼百事通查詢,當時要求提供按筆畫、部首、拼音的多種查詢方式,拼音排序直接按名稱欄位進行排序時總有些是是而非的錯誤,百思不得其解;同時筆畫、部首排序也摸不著頭腦。。。
數字和英文混合排序
1,3,A,B,101,301,AB,BA
要求按照數字,字元分別進行排序,同時在統一類別資料中,首先按數字ASC,再次按長度排序,要求結果如下
1,101,3,301,A,AB,B,BA 或者
1,3,101,301,A,B,AB,BA
但是很奇怪,第一個排序似乎在合併兩個檢視之後,排序規則有點亂了。。。
CREATE TABLE TestNumberChar ( SortName VARCHAR2(20) ) INSERT INTO TestNumberChar VALUES('1'); INSERT INTO TestNumberChar VALUES('3'); INSERT INTO TestNumberChar VALUES('A'); INSERT INTO TestNumberChar VALUES('B'); INSERT INTO TestNumberChar VALUES('101'); INSERT INTO TestNumberChar VALUES('301'); INSERT INTO TestNumberChar VALUES('AB'); INSERT INTO TestNumberChar VALUES('BA'); COMMIT; |
CREATE VIEW vSortNumber as SELECT * FROM TestNumberChar WHERE SUBSTR(SortName,1,1) IN ('0','1','2','3','4','5','6','7','8','9') ORDER BY LENGTH(SortName),SortName
CREATE VIEW vSortChar as SELECT * FROM TestNumberChar WHERE SUBSTR(SortName,1,1) NOT IN ('0','1','2','3','4','5','6','7','8','9') ORDER BY LENGTH(SortName),SortName
SELECT * FROM vSortNumber UNION SELECT * FROM vSortChar |
Order |
Sort Result |
1 |
1 |
2 |
101 |
3 |
3 |
4 |
301 |
5 |
A |
6 |
AB |
7 |
B |
8 |
BA |
SELECT * FROM TestNumberChar ORDER BY TO_NUMBER ( SUBSTR ( SortName,1,LENGTH(SortName)-NVL ( LENGTH ( REPLACE ( TRANSLATE(SortName,'0123456789.','00000000000'),'0' ) ),0 ) ) )
SELECT SortName A, TRANSLATE(SortName,'0123456789.','00000000000') B , REPLACE(TRANSLATE(SortName,'0123456789.','00000000000'),'0') C, LENGTH(REPLACE(TRANSLATE(SortName,'0123456789.','00000000000'), '0')) D, NVL(LENGTH(REPLACE(TRANSLATE(SortName,'0123456789.', '00000000000'),'0')),0) E, LENGTH(SortName)-NVL(LENGTH(REPLACE(TRANSLATE(SortName, '0123456789.','00000000000'),'0')),0) F, SUBSTR(SortName,1,LENGTH(SortName)- NVL(LENGTH(REPLACE(TRANSLATE(SortName,'0123456789.', '00000000000'),'0')),0)) G, TO_NUMBER(SUBSTR(SortName,1, LENGTH(SortName)-NVL(LENGTH(REPLACE( TRANSLATE(SortName,'0123456789.','00000000000'),'0')),0))) H FROM TestNumberChar ORDER BY TO_NUMBER(SUBSTR(SortName,1, LENGTH(SortName)-NVL(LENGTH(REPLACE(TRANSLATE(SortName, '0123456789.','00000000000'),'0')),0))) |
Sort |
A |
B |
C |
D |
E |
F |
G |
H |
1 |
1 |
0 |
|
|
0 |
1 |
1 |
1 |
2 |
3 |
0 |
|
|
0 |
1 |
3 |
3 |
3 |
101 |
000 |
|
|
0 |
3 |
101 |
101 |
4 |
301 |
000 |
|
|
0 |
3 |
301 |
301 |
5 |
A |
A |
A |
1 |
1 |
0 |
|
|
6 |
B |
B |
B |
1 |
1 |
0 |
|
|
7 |
BA |
BA |
BA |
2 |
2 |
0 |
|
|
8 |
AB |
AB |
AB |
2 |
2 |
0 |
|
|
關於漢字字元排序
CREATE TABLE TestHZ ( SortName VARCHAR2(20) ) INSERT INTO TestHZ VALUES ('你'); INSERT INTO TestHZ VALUES ('我'); INSERT INTO TestHZ VALUES ('他'); INSERT INTO TestHZ VALUES ('雞'); INSERT INTO TestHZ VALUES ('鴨'); INSERT INTO TestHZ VALUES ('鵝'); INSERT INTO TestHZ VALUES ('銠'); COMMIT; |
The NLSSORT Function
The NLSSORT function enables you to use any linguistic sort for an ORDER BY clause. It replaces a character string with the equivalent sort string used by the linguistic sort mechanism so that sorting the replacement strings produces the desired sorting sequence. For a binary sort, the sort string is the same as the input string.
The kind of linguistic sort used by an ORDER BY clause is determined by the NLS_SORT session parameter, but it can be overridden by explicitly using the NLSSORT function.
SELECT * FROM TestHZ --按拼音排序 ORDER BY SortName --按筆畫(第一順序)、部首(第二順序)排序 ORDER BY NLSSORT(SortName,'NLS_SORT = SCHINESE_STROKE_M') SELECT * FROM TestHZ ORDER BY NLSSORT(SortName,'NLS_SORT = SCHINESE_RADICAL_M') SELECT * FROM TestHZ ORDER BY NLSSORT(SortName,'NLS_SORT = SCHINESE_PINYIN_M') |
粗略的看一下結果,Sort By和Sort By NLSSORT(XXX,’NLS_SORT = SCHINESE_PINYIN_M’)排序結果差不多,實際上,排序不同主要是針對一些比較生僻的漢字而言的,如“銠”。具體問題出在哪裡,暫時也不清楚。。。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/6517/viewspace-145517/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 與堆和堆排序相關的問題排序
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 新學習的計數排序排序
- 基於桶的排序之計數排序排序
- 桶排序和基數排序排序
- 多關鍵字排序排序
- mysql字符集和字元排序MySql字元排序
- 非交換排序-計數排序和桶排序排序
- 歸併排序和基數排序排序
- 基於桶的排序之基數排序以及排序方法總結排序
- C#關於List<T>的自定義排序學習筆記C#排序筆記
- 演算法學習之選擇排序和堆排序:演算法排序
- Elasticsearch聚合學習之五:排序結果不準的問題分析Elasticsearch排序
- 關於java記憶體訪問重排序的思考Java記憶體排序
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序
- 關於陣列的物件獲取及排序問題/小程式的多層頁面返回問題陣列物件排序
- PHP字串學習之如何返回漢字或混合字元的長度PHP字串字元
- 計數排序vs基數排序vs桶排序排序
- Oracle OCP(02):條件和排序Oracle排序
- Spark學習——排序ShuffleSpark排序
- Array.sort排序問題排序
- 單連結串列的排序問題排序
- 這就是選擇排序的問題排序
- 透過Treeset解決隨機數排序問題隨機排序
- Collections.sort()方法,字元排序字元排序
- 使用 volatile 關鍵字保證變數可見性和禁止指令重排序變數排序
- 資料結構和演算法面試題系列—排序演算法之快速排序資料結構演算法面試題排序
- LeetCode 關於陣列的相對排序LeetCode陣列排序
- 關於非同步爬蟲排序的困惑非同步爬蟲排序
- 資訊學奧賽複賽複習13-CSP-J2021-02插入排序-排序穩定性、插入排序、sort排序、結構圖、計數排序排序
- Java排序之計數排序Java排序
- 看動畫學演算法之:排序-基數排序動畫演算法排序
- 彩虹排序 | 荷蘭旗問題排序
- 對陣列中的數字 1 和 2 進行排序,使得數字 1、2 分別位於前、後部分陣列排序
- Java使用Collections對中文字元進行首字母排序Java字元排序
- 資料結構和演算法面試題系列—排序演算法之基礎排序資料結構演算法面試題排序
- isAlnum判斷字元是否為字母數字字元(字母和數字都屬於字母數字字元)字元
- 匹配字母、數字和中文字元正規表示式字元
- 關於ID自動排序!新手求救!排序