Oracle排序总结:
1.中文字符串排序:
Oracle 9i之前:按二进制字符串编码排序:
Oracle 9i:按默认拼音排序:
例如:
- SELECT * FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_PINYIN_M');
- SELECT * FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_STROKE_M');
- SELECT * FROM 表名 ORDER BY NLSSORT(排序字段名,'NLS_SORT = SCHINESE_RADICAL_M');
- SELECT * FROM TABLE order by instr('中,国',regexp_substr(排序字段名,'[中国]',1),1,1) ;//先按中排序后按国排序
注:配置在初始化参数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进制排序,而是使用上面介绍的4种方法针对中文的特殊排序,则oracle无法使用索引,会进行全表扫描.这点一定要注意,多用plsql工具比较一下执行效率.解决方法是,在此列上建立linguistic index.例如:CREATE INDEX nls_index ON my_table (NLSSORT(name, 'NLS_SORT = SCHINESE_PINYIN_M'));
2.数字排序:
利用oracle函数及正则表达式进行排序 order by to_number(regexp_substr(字段名,'[0-9]*[0-9]',1))。