Oracle中获取汉字的拼音

最近有个需求,要根据中文来获取汉语拼音的首字母。记得很早以前版主 chensq和 jlandzpa就给出过解决方法。不过这么简单的需求没有必要再去费劲找了,自己写一个就可以了。

介绍一下处理的思路,最简单的思路莫过于构造一个汉字库,手工为所有的汉字添加拼音,但是这种方法需要大量的人工录入工作,如果可以找到现成的字库倒是可以考虑。

那么能否利用 Oracle提供的现有功能来解决。首先想到的是 Oracle提供了 SOUNDEX函数:

SQL> SELECT SOUNDEX('WORD') FROM DUAL;

SOUN

----

W630

SQL> SELECT SOUNDEX(' 词 ') FROM DUAL;

S

-

可惜的是,这个函数只对英文有效,对中文无效。看来只能使用其他的方法。

Oracle 对各个国家不同的语言进行了本地化的开发,这其中就包括排序方式。查询了一下 Oracle对于中文的排序支持,果然发现了对简体中文拼音的支持。

Oracle 的 SCHINESE_PINYIN_M排序方式可以支持中文的拼音排序,下面简单看一下使用这个中文拼音排序的例子:

SQL> WITH A AS

2 (SELECT ' 获取汉字拼音首字母 ' W FROM DUAL)

3 SELECT SUBSTR(W, ROWNUM, 1) FROM A

4 CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A);

SU

-- 获 取 汉 字 拼 音 首 字 母

已选择 9行。

下面加上 NLSSORT排序,并指定排序方法为 SCHINESE_PINYIN_M:

SQL> WITH A AS

2 (SELECT ' 获取汉字拼音首字母 ' W FROM DUAL)

3 SELECT SUBSTR(W, ROWNUM, 1) FROM A

4 CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A)

5 ORDER BY NLSSORT(SUBSTR(W, ROWNUM, 1), 'NLS_SORT=SCHINESE_PINYIN_M');

SU

-- 汉 获 母 拼 取 首 音 字 字

已选择 9行。

利用 Oracle的现成的排序方法,编写获取拼音首字母的函数就十分容易了,只需要找到每个首字母对应开头汉字和结尾汉字,根据这些边界汉字进行比较,就可以找到当前汉字的首字母信息。

SQL> WITH A AS

2 (

3 SELECT ROWNUM RN, CHR(ROWNUM) C FROM DUAL CONNECT BY LEVEL <= 65535

4 )

5 SELECT * FROM A WHERE LENGTHB(C) = 2

6 AND RN > 32768

7 AND NLSSORT(C, 'NLS_SORT=SCHINESE_PINYIN_M') > NLSSORT(' 澳 ', 'NLS_SORT=SCHINESE_PINYIN_M')

8 AND NLSSORT(C, 'NLS_SORT=SCHINESE_PINYIN_M') < NLSSORT('巴 ', 'NLS_SORT=SCHINESE_PINYIN_M')

9 ORDER BY NLSSORT(C, 'NLS_SORT=SCHINESE_PINYIN_M');

RN C

---------- --

54931 謸

63179 鏊

62088 驁

45259 八

33172 仈

利用类似这样的方法,就可以分别找到每个首字母对应的字头和字尾。下面构建一个函数就十分容易了:

SQL> CREATE OR REPLACE FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS

V_ORIGINAL VARCHAR2(100);

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_ORIGINAL := SUBSTR(P_NAME, I, 1);

V_COMPARE := F_NLSSORT(V_ORIGINAL);

IF 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';

ELSE

V_RETURN := V_RETURN || V_ORIGINAL;

END IF;

END LOOP;

RETURN V_RETURN;

END;

/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值