首先介绍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. tensorflow weight_variable going

    # coding: utf-8 import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data d ...

  2. 【WIP_S9】图论算法

    创建: 2018/06/01 图的概念 有向边 有向图 无向边 无向图 点的次数: 点连接的边的数量 闭路: 起点和重点一样 连接图: 任意两点之间都可到达 无闭路有向图: 没有闭路的有向图 森林: ...

  3. 洛谷 - UVA11346 - 概率 Probability - 积分

    要是没学过高等数学的积分怎么办呢?可以求助于自适应辛普森法. 容易发现其实这个图形是对称的,我们只要求第一象限就可以了,第一象限如上图. 由于取点是在面积内等概率的,由高中的几何概型可知,所求概率为: ...

  4. Spring中配置Dbutils

    <!--配置QueryRunner--> <bean id="runner" class="org.apache.commons.dbutils.Que ...

  5. VC中使用GDI+实现为按钮加载Png图片

    http://blog.csdn.net/flyfish1986/article/details/5381605 VC中使用GDI+实现为按钮加载Png图片 http://www.codeprojec ...

  6. 51nod1625(枚举&贪心)

    题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1625 题意:中文题诶- 思路:枚举+贪心 一开始写的行和列同时 ...

  7. uoj#268. 【清华集训2016】数据交互(动态dp+堆)

    传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...

  8. PJzhang:python基础入门的7个疗程-one

    猫宁!!! 参考链接:易灵微课-21天轻松掌握零基础python入门必修课-售价29元人民币 https://www.liaoxuefeng.com/wiki/1016959663602400 安全从 ...

  9. PJzhang:百度网盘是如何泄露公司机密的?

    猫宁!!! 参考链接:https://mp.weixin.qq.com/s/PLELMu8cVleOLlwRAAYPVg 百度网盘在中国一家独大,百度超级会员具有很多特权,尤其是在下载速度上,是普通会 ...

  10. route(2018.10.24)

    建出最短路图之后\(topsort\)即可. 具体思路: 先用\(dijkstra\)算法在原图中跑出\(1\)号点到\(i\)号节点的最短距离\(dist_1(i)\),将所有边反向后用\(dijk ...