首先介绍Oracle 9i新增加的一个系统自带的排序函数 
1、按首字母排序 
在oracle9i中新增了按照拼音、部首、笔画排序功能。设置NLS_SORT值     
SCHINESE_RADICAL_M   按照部首(第一顺序)、笔划(第二顺序)排序     
SCHINESE_STROKE_M   按照笔划(第一顺序)、部首(第二顺序)排序     
SCHINESE_PINYIN_M   按照拼音排序 
oracle9i中新增了按照拼音、部首、笔画排序功能 
用法示例:

  1. 拼音
  2. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段,'NLS_SORT = SCHINESE_PINYIN_M')
  3. 笔划
  4. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段,'NLS_SORT = SCHINESE_STROKE_M')
  5. 部首
  6. SELECT * FROM TEAM ORDER BY NLSSORT(排序字段,'NLS_SORT = SCHINESE_RADICAL_M')

2、按首字母拼音查询 
首先我们要创建一个可以查询汉字首字母的函数,函数代码如下:

  1. CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS
  2. V_COMPARE VARCHAR2(100);
  3. V_RETURN VARCHAR2(4000);
  4. FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
  5. BEGIN
  6. RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');
  7. END;
  8. BEGIN
  9. FOR I IN 1..LENGTH(P_NAME) LOOP
  10. V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));
  11. IF V_COMPARE >= F_NLSSORT(' 吖 ') AND V_COMPARE <= F_NLSSORT('驁 ') THEN
  12. V_RETURN := V_RETURN || 'a';
  13. ELSIF V_COMPARE >= F_NLSSORT('八 ') AND V_COMPARE <= F_NLSSORT('簿 ') THEN
  14. V_RETURN := V_RETURN || 'b';
  15. ELSIF V_COMPARE >= F_NLSSORT('嚓 ') AND V_COMPARE <= F_NLSSORT('錯 ') THEN
  16. V_RETURN := V_RETURN || 'c';
  17. ELSIF V_COMPARE >= F_NLSSORT('咑 ') AND V_COMPARE <= F_NLSSORT('鵽 ') THEN
  18. V_RETURN := V_RETURN || 'd';
  19. ELSIF V_COMPARE >= F_NLSSORT('妸 ') AND V_COMPARE <= F_NLSSORT('樲 ') THEN
  20. V_RETURN := V_RETURN || 'e';
  21. ELSIF V_COMPARE >= F_NLSSORT('发 ') AND V_COMPARE <= F_NLSSORT('猤 ') THEN
  22. V_RETURN := V_RETURN || 'f';
  23. ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('腂 ') THEN
  24. V_RETURN := V_RETURN || 'g';
  25. ELSIF V_COMPARE >= F_NLSSORT('妎 ') AND V_COMPARE <= F_NLSSORT('夻 ') THEN
  26. V_RETURN := V_RETURN || 'h';
  27. ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('攈 ') THEN
  28. V_RETURN := V_RETURN || 'j';
  29. ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('穒 ') THEN
  30. V_RETURN := V_RETURN || 'k';
  31. ELSIF V_COMPARE >= F_NLSSORT('垃 ') AND V_COMPARE <= F_NLSSORT('擽 ') THEN
  32. V_RETURN := V_RETURN || 'l';
  33. ELSIF V_COMPARE >= F_NLSSORT('嘸 ') AND V_COMPARE <= F_NLSSORT('椧 ') THEN
  34. V_RETURN := V_RETURN || 'm';
  35. ELSIF V_COMPARE >= F_NLSSORT('拏 ') AND V_COMPARE <= F_NLSSORT('瘧 ') THEN
  36. V_RETURN := V_RETURN || 'n';
  37. ELSIF V_COMPARE >= F_NLSSORT('筽 ') AND V_COMPARE <= F_NLSSORT('漚 ') THEN
  38. V_RETURN := V_RETURN || 'o';
  39. ELSIF V_COMPARE >= F_NLSSORT('妑 ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN
  40. V_RETURN := V_RETURN || 'p';
  41. ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('裠 ') THEN
  42. V_RETURN := V_RETURN || 'q';
  43. ELSIF V_COMPARE >= F_NLSSORT('亽 ') AND V_COMPARE <= F_NLSSORT('鶸 ') THEN
  44. V_RETURN := V_RETURN || 'r';
  45. ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('蜶 ') THEN
  46. V_RETURN := V_RETURN || 's';
  47. ELSIF V_COMPARE >= F_NLSSORT('侤 ') AND V_COMPARE <= F_NLSSORT('籜 ') THEN
  48. V_RETURN := V_RETURN || 't';
  49. ELSIF V_COMPARE >= F_NLSSORT('屲 ') AND V_COMPARE <= F_NLSSORT('鶩 ') THEN
  50. V_RETURN := V_RETURN || 'w';
  51. ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('鑂 ') THEN
  52. V_RETURN := V_RETURN || 'x';
  53. ELSIF V_COMPARE >= F_NLSSORT('丫 ') AND V_COMPARE <= F_NLSSORT('韻 ') THEN
  54. V_RETURN := V_RETURN || 'y';
  55. ELSIF V_COMPARE >= F_NLSSORT('帀 ') AND V_COMPARE <= F_NLSSORT('咗 ') THEN
  56. V_RETURN := V_RETURN || 'z';
  57. END IF;
  58. END LOOP;
  59. RETURN V_RETURN;
  60. END;

随后,我们可以先取出姓名,然后截取第一个汉字,最后取汉字的首字母,即可用来作为查询条件

  1. select e.fullname,e.expert_id from expert e where f_trans_pinyin_capital(substr(e.fullname,1,1)) = 'z'

最后展示一个将两个结合起来运用的例子:

    1. select e.expert_id,e.eperson_id,e.fullname,
    2. sum(b2i.browse_num) browsecount,
    3. count(o.object_id),wmsys.wm_concat(distinct d.name)
    4. from expert e
    5. left join expert2disciplinetype e2d on e2d.expert_id = e.expert_id
    6. left join disciplinetype d on d.discipline_type_id = e2d.discipline_type_id
    7. and d.upid = '0'
    8. left join community2expert c2e on c2e.expert_id = e.expert_id
    9. left join item i on i.item_type_id = 'AcademicRes' and i.withdrawn = 'N'
    10. join metadatavalue m on m.item_id = i.item_id and m.metadata_field_id = '64'
    11. join objectpublishinfo o on o.object_id = i.item_id
    12. and o.object_type = 'item' and o.viewobjecttype = 'eperson'
    13. and o.viewobjectid = e.eperson_id and o.state = '1'
    14. and o.publishstate_id = '3'
    15. left join browse2item b2i on b2i.item_id = o.object_id
    16. where e.state = '1' and f_trans_pinyin_capital(substr(e.fullname,1,1)) = 'z'
    17. group by e.expert_id,e.eperson_id,e.fullname
    18. order by nlssort(e.fullname,'NLS_SORT=SCHINESE_PINYIN_M')

关于java中实现在oracle数据库中实现对中文首字母进行排序的解决方案的更多相关文章

  1. Oracle数据库中调用Java类开发存储过程、函数的方法

    Oracle数据库中调用Java类开发存储过程.函数的方法 时间:2014年12月24日  浏览:5538次 oracle数据库的开发非常灵活,不仅支持最基本的SQL,而且还提供了独有的PL/SQL, ...

  2. java.sql.date与java.util.date区别以及数据库中插入带时分秒的时间

    java.sql.Date,java.sql.Time和java.sql.Timestamp三个都是java.util.Date的子类(包装类). java.sql.Date是java.util.Da ...

  3. Oracle数据库中实现mysql数据库中auto-increment功能

    在Mysql数据库中,想要实现一条数据的自增一功能(即插入此数据时填写null即可,系统自动+1),可直接在所在列使用语句auto-increment. id int primary key auto ...

  4. oracle 数据库中(创建、解锁、授权、删除)用户

    上文我们已经建立了名为orcl66的数据库. 想要在数据库中创建.修改用户需要我们以管理员权限登录到数据库中. 首先我们通过sqlplus命令登录连接数据库. 输入sqlplus命令--用户名: sy ...

  5. Oracle数据库中字段定义为Char类型,Hibernate用该字段进行动态绑定参数查询,获取不到结果的问题

    一.问题背景 产生环境:oracle数据库,hibernate操作 定义了一个表 create table STORE_INFORMATION ( id CHAR(32) not null, name ...

  6. 将Oracle数据库中的数据写入Excel

    将Oracle数据库中的数据写入Excel 1.准备工作 Oracle数据库"TBYZB_FIELD_PRESSURE"表中数据如图: Excel模板(201512.xls): 2 ...

  7. --关于null在oracle数据库中是否参与计算,进行验证,

    --关于null在oracle数据库中是否参与计算,进行验证,with td as (select null id,1 name from dual ),td1 as ( select null id ...

  8. Oracle数据库中SYS、SYSTEM、DBSNMP、SYSMAN四用户的区别

    [转]   SYS.SYSTEM.DBSNMP. Oracle 数据库中 SYS.SYSTEM.DBSNMP.SYSMAN 四用户的区别 用户: SYS 用户: SYS,默认密码为 CHANGE_ON ...

  9. 【转】Oracle数据库中Sequence的用法

    在Oracle数据库中,sequence等同于序列号,每次取的时候sequence会自动增加,一般会作用于需要按序列号排序的地方. 1.Create Sequence (注释:你需要有CREATE S ...

随机推荐

  1. struts2-045漏洞浅析

    http://blog.csdn.net/rossrocket/article/details/67674290

  2. UVa 12333 Revenge of Fibonacci (字典树+大数)

    题意:给定一个长度小于40的序列,问你那是Fib数列的哪一项的前缀. 析:首先用大数把Fib数列的前100000-1项算出来,注意,一定不能是100000,要不然会WA的,然后每个数取前40位,不足4 ...

  3. CCF 201604-1 折点计数 (水题,暴力)

    问题描述 给定n个整数表示一个商店连续n天的销售量.如果某天之前销售量在增长,而后一天销售量减少,则称这一天为折点,反过来如果之前销售量减少而后一天销售量增长,也称这一天为折点.其他的天都不是折点.如 ...

  4. 不能支持C++11的特性~,升级到4.8.2

    一.简易安装 操作环境 CentOS6.5 64bit,原版本4.4.7,不能支持C++11的特性~,希望升级到4.8.2 不能通过yum的方法升级,需要自己手动下载安装包并编译 1.1 获取安装包并 ...

  5. E20190212-mt

    创建: 2019/02/12 reserve n. 储备; 保留; 保护区; 替补队员;      vt. 储备; 保留; 预约;   vi. 预订; slot n. 位置; 狭槽,水沟; [人名] ...

  6. opencv surf特征点匹配拼接源码

    http://blog.csdn.net/huixingshao/article/details/42672073 /** * @file SURF_Homography * @brief SURF ...

  7. c# 中的 protected internal 如何在 vc.net 中实现

    c# 中有 protected internal 的复合访问属性, 保证assembly内部访问,以及外部的派生类访问 vc.net 中无法直接写上 protected internal, 其对应的写 ...

  8. [Xcode 实际操作]九、实用进阶-(31)为IAP(支付方式)内购功能的具体实现和测试

    目录:[Swift]Xcode实际操作 本文将演示如何为IAP(支付方式)内购功能的具体实现和测试. 内购是苹果市场上的一种常见的盈利方式. 在项目中确保已经安装了第三方库[Pod],双击[Podfi ...

  9. Python学习 Part2:深入Python函数定义

    在Python中,可以定义包含若干参数的函数,这里有几种可用的形式,也可以混合使用: 1. 默认参数 最常用的一种形式是为一个或多个参数指定默认值. >>> def ask_ok(p ...

  10. JToken和JObject有什么区别

    JObject  用于操作JSON对象JArray    用语操作JSON数组JValue   表示数组中的值JProperty 表示对象中的属性,以"key/value"形式JT ...