oracle 拼音首字母查询,用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;

你可能感兴趣的:(oracle,拼音首字母查询)