1. 程式人生 > >SQL學習之使用order by 依照指定順序排序或自己定義順序排序

SQL學習之使用order by 依照指定順序排序或自己定義順序排序

使用 auto acc font data- anything 優化 建立 exec

我們通常須要依據客戶需求對於查詢出來的結果給客戶提供自己定義的排序方式,那麽我們通常sql須要實現方式都有哪些,參考很多其它資料總結例如以下(不完好的和錯誤望大家指出):

一、假設我們僅僅是對於在某個程序中的應用是須要依照例如以下的方式排序,我們僅僅需在SQL語句級別設置排序方式:

1、依照oracled的默認方式排序:select * from table_name order by col_name (desc|asc);(默覺得升序或無序對於升降僅僅有在數字字段);

2、依照自己定義的順序排序: select * from table_name order by decode(col_name

,‘value1‘,1,value2‘,2,value3‘,3,value4‘,4,...valueN‘,N);

二、假設我們僅僅是對於在某個程序中的應用是須要依照例如以下設置的方式排序,我們僅僅需在SQL語句級別設置排序方式(一般沒有設置之前我們系統的中文默認排序方式是依照拼音排序 ):

1、依照拼音排序: select * fromtable_name order by nlssort(col_name,‘NLS_SORT=SCHINESE_PINYIN_M‘);
2、依照筆劃排序: select * from table_name order by nlssort(col_name,‘NLS_SORT=SCHINESE_STROKE_M‘);


3、依照部首排序: select * from table_name order by nlssort(col_name,‘NLS_SORT=SCHINESE_RADICAL_M‘);
註意:可是在數據量比較大情況下查詢速度會非常慢,須要進行進一步優化。按oracle官方文檔的解釋,oracle在對中文列建立索引時,是依照2進制編碼進行排序的,所以假設NLS_SORT被設置為BINARY時。排序則能夠利用索引.假設不是2進制排序,而是使用上面介紹的3種針對中文的特殊排序,則oracle無法使用索引。會進行全表掃描.解決方法是,在此列上建立linguistic index.比如:CREATE INDEX nls_index ON my_table (NLSSORT(name, ‘NLS_SORT =
SCHINESE_PINYIN_M‘));

引用原文:Note:

Setting NLS_SORT to anything other than BINARY causes a sort to use a full table scan, regardless of the path chosen by the optimizer. BINARY is the exception because indexes are built according to a binary order of keys. Thus the optimizer can use an index to satisfy the ORDER BY clause when NLS_SORT is set to BINARY. If NLS_SORT is set to any linguistic sort, the optimizer must include a full table scan and a full sort in the execution plan.


三、假設我們在整個會話中都要使用特定的方式排序的話,我們須要在Session級別的設置字段的默認排序方式:
1.按拼音:alter session set nls_sort = SCHINESE_PINYIN_M;
2.按筆畫:alter session set nls_sort = SCHINESE_STROKE_M;
3.按偏旁:alter session set nls_sort = NLS_SORT=SCHINESE_RADICAL_M;

四、假設我們須要對整個數據做指定的排序方式,就須要改動oracle server系統參數(一般這樣的方式我們使用的比較少):
1. win系統改動註冊表 HKLC\SOFTWARE\ORACLE\home0\NLS_SORT

2.其它改動配置set NLS_SORT=SCHINESE_RADICAL_M export NLS_SORT

SQL學習之使用order by 依照指定順序排序或自己定義順序排序