oracle 中几种排序方法

一、随机排序:

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_tab
order by decode(item, 'Viki', 1, 'Glen', 2, 'Robin', 3, 'Nick', 4, 'Total', 99);

另一种写法:

SELECT * FROM (
select '海尔' v,1 o from dual
union all
select '联想' v,2 o from dual
union all
select '索尼' v,3 o from dual)
order by instr('索尼,联想,海尔',v)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值