Oracle中針對中文進行排序


轉自:http://www.cnblogs.com/discuss/articles/1866953.html

在oracle 9i之前,對中文的排序,是默認按2進制編碼來進行排序的. 9i時增加了幾種新的選擇:

  1. 按中文拼音進行排序:SCHINESE_PINYIN_M
  2. 按中文部首進行排序:SCHINESE_RADICAL_M
  3. 按中文筆畫進行排序:SCHINESE_STROKE_M

而oracle 9i是對中文的排序是默認按拼音排序(並不是指NLS_SORT = SCHINESE_PINYIN_M,而是說SQL中不指定NLS_SORT時對中文列排序時默認按拼音)的,跟之前的2進制編碼排序有所不同.

 

  1. 直接寫在sql中,例如:
    1. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M');
    2. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_STROKE_M');
    3. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_RADICAL_M');
  2. 配置在初始化參數NLS_SORT中,這可以在數據庫創建時指定,也可以通過alter session來修改.如果是前者,則在所有session中生效.例如:
    1. 使用select * from NLS_SESSION_PARAMETERS;語句可以看到NLS_SORT的值.
    2. 更改配置文件:alter system set nls_sort='SCHINESE_PINYIN_M' scope=spfile;
    3. 更改session:alter SESSION set NLS_SORT = SCHINESE_PINYIN_M;

 

這里要額外注意一下性能問題,按oracle官方文檔的解釋,oracle在對中文列建立索引時,是按照2進制編碼進行排序的,所以如果NLS_SORT被設置為BINARY時,排序則可以利用索引.如果不是2進制排序,而是使用上面介紹的3種針對中文的特殊排序,則oracle無法使用索引,會進行全表掃描.這點一定要注意,多用plsql工具比較一下執行效率.解決方法是,在此列上建立linguistic index.例如:CREATE INDEX nls_index ON my_table (NLSSORT(name, 'NLS_SORT = SCHINESE_PINYIN_M'));

 

轉自:http://www.blogjava.net/hwpok/archive/2010/06/25/324397.html

一、中文排序   
   1. //按照筆划排序 

   2. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_STROKE_M'); 

   3. //按照部首排序 

   4. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_RADICAL_M'); 

   5. //按照拼音排序,此為系統的默認排序方式 

   6. select * from dept order by nlssort(name,'NLS_SORT=SCHINESE_PINYIN_M'); 

二、排序字段為空(以下內容轉載http://space.itpub.net/10768286/viewspace-269175) 
   1、缺省處理 

Oracle在Order by 時缺省認為null是最大值,所以如果是ASC升序則排在最后,DESC降序則排在最前 
2、使用nvl函數 

nvl函數可以將輸入參數為空時轉換為一特定值,如 
nvl(employee_name,’張三’)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name 
通過這個函數可以定制null的排序位置。 
3、使用decode函數 
decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,缺省值) 
decode函數比nvl函數更強大,同樣它也可以將輸入參數為空時轉換為一特定值,如 
decode(employee_name,null,’張三’, employee_name)表示當employee_name為空時則返回’張三’,如果不為空則返回employee_name 
通過這個函數可以定制null的排序位置。 

DECODE函數是ORACLE PL/SQL是功能強大的函數之一,目前還只有ORACLE公司的SQL提供了此函數,其他數據庫廠商的SQL實現還沒有此功能。DECODE有什么用途呢?先構造一個例子,假設我們想給智星職員加工資,其標准是:工資在8000元以下的將加20%;工資在8000元以上的加15%,通常的做法是,先選出記錄中的工資字段值? select salary into var-salary from employee,然后對變量var-salary用if-then-else或choose case之類的流控制語句進行判斷。如果用DECODE函數,那么我們就可以把這些流控制語句省略,通過SQL語句就可以直接完成。如下:select decode(sign(salary - 8000),1,salary*1.15,-1,salary*1.2,salary from employee 是不是很簡潔? DECODE的語法:DECODE(value,if1,then1,if2,then2,if3,then3,...,else),表示如果value 等於if1時,DECODE函數的結果返回then1,...,如果不等於任何一個if值,則返回else。初看一下,DECODE 只能做等於測試,但剛才也看到了,我們通過一些函數或計算替代value,是可以使DECODE函數具備大於、小於或等於功能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM