用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;