轉自:http://www.cnblogs.com/discuss/articles/1866953.html
在oracle 9i之前,對中文的排序,是默認按2進制編碼來進行排序的. 9i時增加了幾種新的選擇:
- 按中文拼音進行排序:SCHINESE_PINYIN_M
- 按中文部首進行排序:SCHINESE_RADICAL_M
- 按中文筆畫進行排序:SCHINESE_STROKE_M
而oracle 9i是對中文的排序是默認按拼音排序(並不是指NLS_SORT = SCHINESE_PINYIN_M,而是說SQL中不指定NLS_SORT時對中文列排序時默認按拼音)的,跟之前的2進制編碼排序有所不同.
- 直接寫在sql中,例如:
- SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M');
- SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_STROKE_M');
- SELECT * FROM TEAM ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_RADICAL_M');
- 配置在初始化參數NLS_SORT中,這可以在數據庫創建時指定,也可以通過alter session來修改.如果是前者,則在所有session中生效.例如:
- 使用select * from NLS_SESSION_PARAMETERS;語句可以看到NLS_SORT的值.
- 更改配置文件:alter system set nls_sort='SCHINESE_PINYIN_M' scope=spfile;
- 更改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函數具備大於、小於或等於功能。