用Oracle的NLSSORT获取拼音首字母

用Oracle的NLSSORT获取拼音首字母

最近,某系统上线,需要将基础资料初始导入进系统,其中有客户名称一列对应着客户助记符一列,助记符是由客户名称取各个汉字拼音首字母而得来的.
所以,需要获取汉字字符串的拼音首字母.

此前,接触过汉字编码(国标区位码)的一些知识:
国标区位码表(GB2312-80),共设置94个区,每个区94个位.(所以称为区位码).一共7445个字符,其中汉字6763个.
第1-9区是符号部分,从16区开始是汉字部分,汉字部分按汉字是否常用分为上下两个区域,第16-55区是上半区域,汉字按拼音排序,共3755个,
第56-87区是下半区域,汉字按部首(笔画笔形)排序,共3008个.
基于此原理,网上也广泛流传一些代码(包括使用Delphi,VFP等等开发语言的,也包括使用Excel宏功能代码的).测试了一下,对于上半区的汉字都能很好的处理,取得正确的拼音首字母,而对于下半区的汉字,要么一概获取成字母z,要么获取成其他非字母字符.
总之,是不甚理想.

想到Oracle数据库有字符集等等概念(SQL Server有排序规则的概念),所以,从网络上查找数据库方面的获取拼音首字母的方法.
还真是找到了效果理想的函数.摘记于下.
其中,核心就是利用NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M')来根据简体中文拼音取的顺序编号,然后与其分界编号进行对比,得到首字母.

----注:以下是摘记.不是原创.
CREATE OR REPLACE FUNCTION F_GET_PY_CAP(P_NAME IN VARCHAR2)
 RETURN VARCHAR2 AS
 v_word    VARCHAR2(10);
 V_COMPARE VARCHAR2(100);
 V_RETURN  VARCHAR2(4000);

 FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS
 BEGIN
  RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');
 END;
BEGIN
 FOR I IN 1 .. LENGTH(P_NAME) LOOP
  v_word    := SUBSTR(P_NAME, I, 1);
  V_COMPARE := F_NLSSORT(v_word);
  IF V_COMPARE >= F_NLSSORT('a') AND V_COMPARE <= F_NLSSORT('z') THEN
   V_RETURN := V_RETURN || v_word;
  ELSIF V_COMPARE >= F_NLSSORT('A') AND V_COMPARE <= F_NLSSORT('Z') THEN
   V_RETURN := V_RETURN || v_word;
  ELSIF V_COMPARE >= F_NLSSORT('0') AND V_COMPARE <= F_NLSSORT('9') THEN
   V_RETURN := V_RETURN || v_word;
 
  ELSIF V_COMPARE >= F_NLSSORT('吖') AND V_COMPARE <= F_NLSSORT('驁') THEN
   V_RETURN := V_RETURN || 'a';
  ELSIF V_COMPARE >= F_NLSSORT('八') AND V_COMPARE <= F_NLSSORT('簿') THEN
   V_RETURN := V_RETURN || 'b';
  ELSIF V_COMPARE >= F_NLSSORT('嚓') AND V_COMPARE <= F_NLSSORT('錯') THEN
   V_RETURN := V_RETURN || 'c';
  ELSIF V_COMPARE >= F_NLSSORT('咑') AND V_COMPARE <= F_NLSSORT('鵽') THEN
   V_RETURN := V_RETURN || 'd';
  ELSIF V_COMPARE >= F_NLSSORT('妸') AND V_COMPARE <= F_NLSSORT('樲') THEN
   V_RETURN := V_RETURN || 'e';
  ELSIF V_COMPARE >= F_NLSSORT('发') AND V_COMPARE <= F_NLSSORT('猤') THEN
   V_RETURN := V_RETURN || 'f';
  ELSIF V_COMPARE >= F_NLSSORT('旮') AND V_COMPARE <= F_NLSSORT('腂') THEN
   V_RETURN := V_RETURN || 'g';
  ELSIF V_COMPARE >= F_NLSSORT('妎') AND V_COMPARE <= F_NLSSORT('夻') THEN
   V_RETURN := V_RETURN || 'h';
  ELSIF V_COMPARE >= F_NLSSORT('丌') AND V_COMPARE <= F_NLSSORT('攈') THEN
   V_RETURN := V_RETURN || 'j';
  ELSIF V_COMPARE >= F_NLSSORT('咔') AND V_COMPARE <= F_NLSSORT('穒') THEN
   V_RETURN := V_RETURN || 'k';
  ELSIF V_COMPARE >= F_NLSSORT('垃') AND V_COMPARE <= F_NLSSORT('擽') THEN
   V_RETURN := V_RETURN || 'l';
  ELSIF V_COMPARE >= F_NLSSORT('嘸') AND V_COMPARE <= F_NLSSORT('椧') THEN
   V_RETURN := V_RETURN || 'm';
  ELSIF V_COMPARE >= F_NLSSORT('拏') AND V_COMPARE <= F_NLSSORT('瘧') THEN
   V_RETURN := V_RETURN || 'n';
  ELSIF V_COMPARE >= F_NLSSORT('筽') AND V_COMPARE <= F_NLSSORT('漚') THEN
   V_RETURN := V_RETURN || 'o';
  ELSIF V_COMPARE >= F_NLSSORT('妑') AND V_COMPARE <= F_NLSSORT('曝') THEN
   V_RETURN := V_RETURN || 'p';
  ELSIF V_COMPARE >= F_NLSSORT('七') AND V_COMPARE <= F_NLSSORT('裠') THEN
   V_RETURN := V_RETURN || 'q';
  ELSIF V_COMPARE >= F_NLSSORT('亽') AND V_COMPARE <= F_NLSSORT('鶸') THEN
   V_RETURN := V_RETURN || 'r';
  ELSIF V_COMPARE >= F_NLSSORT('仨') AND V_COMPARE <= F_NLSSORT('蜶') THEN
   V_RETURN := V_RETURN || 's';
  ELSIF V_COMPARE >= F_NLSSORT('侤') AND V_COMPARE <= F_NLSSORT('籜') THEN
   V_RETURN := V_RETURN || 't';
  ELSIF V_COMPARE >= F_NLSSORT('屲') AND V_COMPARE <= F_NLSSORT('鶩') THEN
   V_RETURN := V_RETURN || 'w';
  ELSIF V_COMPARE >= F_NLSSORT('夕') AND V_COMPARE <= F_NLSSORT('鑂') THEN
   V_RETURN := V_RETURN || 'x';
  ELSIF V_COMPARE >= F_NLSSORT('丫') AND V_COMPARE <= F_NLSSORT('韻') THEN
   V_RETURN := V_RETURN || 'y';
  ELSIF V_COMPARE >= F_NLSSORT('帀') AND V_COMPARE <= F_NLSSORT('咗') THEN
   V_RETURN := V_RETURN || 'z';
  END IF;
 END LOOP;
 RETURN upper(V_RETURN);
END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29512902/viewspace-1399416/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29512902/viewspace-1399416/

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值