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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 中文排序 問題排序
- 【SQL 學習】排序問題之order by與索引排序SQL排序索引
- SQL SERVER和ORACLE的排序問題SQLServerOracle排序
- 關於mysql5.6 的排序問題.MySql排序
- C#按字串中的數字排序問題C#字串排序
- ORACLE中文排序Oracle排序
- 關於全問檢索按照日期的排序問題排序
- oracle中排序問題Oracle排序
- 與堆和堆排序相關的問題排序
- 新學習的計數排序排序
- 計數排序、桶排序和基數排序排序
- 關於mysql字元和數字型別轉換的問題研究MySql字元型別
- 基於桶的排序之計數排序排序
- 桶排序和基數排序排序
- mysql中的(字元)轉換函式以及排序問題。MySql字元函式排序
- 非交換排序-計數排序和桶排序排序
- 【R語言學習筆記】若干排序問題R語言筆記排序
- 多關鍵字排序排序
- 排序(2)--選擇排序,歸併排序和基數排序排序
- 關於字串中取相同的字元問題(小學題)字串字元
- 歸併排序和基數排序排序
- C#關於List<T>的自定義排序學習筆記C#排序筆記
- 基於桶的排序之基數排序以及排序方法總結排序
- 演算法學習之選擇排序和堆排序:演算法排序
- 關於ORACLE和MYSQL中文字元亂碼的根源剖析OracleMySql字元
- 關於過濾字元的問題字元
- 撲克牌排序:基於基數排序的方法排序
- 【SQL 學習】minus 和intsect 的排序方式!SQL排序
- mysql字符集和字元排序MySql字元排序
- 字串排序問題字串排序
- group by 排序問題排序
- Collections排序問題!!排序
- connect by 的排序問題排序
- 計數排序的原址排序排序
- Elasticsearch聚合學習之五:排序結果不準的問題分析Elasticsearch排序
- 關於js陣列的六種演算法---水桶排序,氣泡排序,選擇排序,快速排序,插入排序,希爾排序的理解。JS陣列演算法排序
- PHP字串學習之如何返回漢字或混合字元的長度PHP字串字元
- 關於js陣列方法sort()負數排序的陷阱JS陣列排序