zoukankan      html  css  js  c++  java
  • Oracle中针对中文进行排序

    转自:http://www.cnblogs.com/discuss/articles/1866953.html

    在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'));

    转自: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函数具备大于、小于或等于功能。

  • 相关阅读:
    Ubuntu 16 安装redis客户端
    crontab 参数详解
    PHP模拟登录发送闪存
    Nginx配置端口访问的网站
    Linux 增加对外开放的端口
    Linux 实用指令之查看端口开启情况
    无敌的极路由
    不同的域名可以指向同一个项目
    MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error
    Redis 创建多个端口
  • 原文地址:https://www.cnblogs.com/wllcs/p/6148232.html
Copyright © 2011-2022 走看看