使用ORACLE函数,可以实现许多我们需要的功能,下面就教您如何使用ORACLE函数实现按汉字拼音首字母查询,如果您对ORACLE函数使用方面感兴趣的话,不妨一看。

列表一行汉字 WITH A AS (SELECT ‘获取汉字拼音首字母’ W FROM DUAL) SELECT SUBSTR(W, ROWNUM, 1) FROM A CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A); 返回结果 获 取 汉 字 拼 音 首 字 母

用汉字字符集对这个列表进行排序 WITH A AS (SELECT ‘获取汉字拼音首字母’ W FROM DUAL) SELECT SUBSTR(W, ROWNUM, 1) FROM A CONNECT BY ROWNUM <= (SELECT LENGTH(W) FROM A) ORDER BY NLSSORT(SUBSTR(W, ROWNUM, 1), ‘NLS_SORT=SCHINESE_PINYIN_M’); 返回结果 汉 获 母 拼 取 首 音 字 字

那么根据这个原理,上面输入一个拼音A打头的字”澳”,后面输入一个B大头的字”吧”,找到每个音节的起止的汉字是哪个 WITH A AS ( SELECT ROWNUM RN, CHR(ROWNUM) C FROM DUAL CONNECT BY LEVEL <= 65535 ) SELECT * FROM A WHERE LENGTHB(C) = 2 AND RN > 32768 AND NLSSORT(C, ‘NLS_SORT=SCHINESE_PINYIN_M’) > NLSSORT(‘澳’, ‘NLS_SORT=SCHINESE_PINYIN_M’) AND NLSSORT(C, ‘NLS_SORT=SCHINESE_PINYIN_M’) < NLSSORT(‘吧’, ‘NLS_SORT=SCHINESE_PINYIN_M’) ORDER BY NLSSORT(C, ‘NLS_SORT=SCHINESE_PINYIN_M’); 根据返回的结果,就能看到,A的结束和B的开始的汉子分别是:“驁” “八”,依次类推可以找到其他的分界点,那么***的ORACLE函数就是如下:

CREATE OR REPLACE FUNCTION F_TRANS_PINYIN_CAPITAL(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS 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_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1)); 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’; END IF; END LOOP; RETURN V_RETURN; END;

测试一下: SELECT F_TRANS_PINYIN_CAPITAL(‘罗华’) FROM DUAL 返回 lh 使用的时候这样查询: select name from users t1 where (t1.name = ? or F_TRANS_PINYIN_CAPITAL(t1.name) = ?) 如果里面的?参数传递的是“罗华”,就是查询用户名是落花的人,如果传递的是lh的话,查询的就是拼音是lh的人

【编辑推荐】

oracle函数返回表的实现

带您了解Oracle FBI索引

详解如何将Oracle安装为Linux服务

详解Oracle多种表连接方式

DB2常用函数和Oracle的比较