一、隨機排序:
select * from tablename order by dbms_random.value);
這種方法一般隨機取前幾行記錄比較有用。對于10W以上的記錄,采取抽樣的方式
select * from (select * from tablename SAMPLE(0.01)) WHERE rownum <= 3;
二、Oracle中針對中文進行排序:
在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'));
三、自定義排序:
Oracle可借助decode函數進行排序:
select * from ( select 'Nick' as item from dual union all select 'Viki' as item from dual union all select 'Glen' as item from dual union all select 'Robin' as item from dual union all select 'Total' as item from dual) PRe_taborder by decode(item, 'Viki', 1, 'Glen', 2, 'Robin', 3, 'Nick', 4, 'Total', 99);
另一種寫法:
SELECT * FROM (select '海爾' v,1 o from dualunion allselect '聯想' v,2 o from dualunion allselect '索尼' v,3 o from dual)order by instr('索尼,聯想,海爾',v)
新聞熱點
疑難解答