程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle數據庫基礎 >> 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的開始的漢子分別是:“” “八”,依次類推可以找到其他的分界點,那麼最後的函數就是如下:

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('e ') THEN
V_RETURN := V_RETURN || 'c';
ELSIF V_COMPARE >= F_NLSSORT(' ') AND V_COMPARE <= F_NLSSORT('z ') 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('g ') THEN
V_RETURN := V_RETURN || 'f';
ELSIF V_COMPARE >= F_NLSSORT('旮 ') AND V_COMPARE <= F_NLSSORT('B ') THEN
V_RETURN := V_RETURN || 'g';
ELSIF V_COMPARE >= F_NLSSORT('o ') AND V_COMPARE <= F_NLSSORT(' ') THEN
V_RETURN := V_RETURN || 'h';
ELSIF V_COMPARE >= F_NLSSORT('丌 ') AND V_COMPARE <= F_NLSSORT('h ') THEN
V_RETURN := V_RETURN || 'j';
ELSIF V_COMPARE >= F_NLSSORT('咔 ') AND V_COMPARE <= F_NLSSORT('i ') 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('p ') AND V_COMPARE <= F_NLSSORT('a ') THEN
V_RETURN := V_RETURN || 'o';
ELSIF V_COMPARE >= F_NLSSORT('r ') AND V_COMPARE <= F_NLSSORT('曝 ') THEN
V_RETURN := V_RETURN || 'p';
ELSIF V_COMPARE >= F_NLSSORT('七 ') AND V_COMPARE <= F_NLSSORT('d ') THEN
V_RETURN := V_RETURN || 'q';
ELSIF V_COMPARE >= F_NLSSORT(' ') AND V_COMPARE <= F_NLSSORT('U ') THEN
V_RETURN := V_RETURN || 'r';
ELSIF V_COMPARE >= F_NLSSORT('仨 ') AND V_COMPARE <= F_NLSSORT('R ') THEN
V_RETURN := V_RETURN || 's';
ELSIF V_COMPARE >= F_NLSSORT('@ ') AND V_COMPARE <= F_NLSSORT('X ') THEN
V_RETURN := V_RETURN || 't';
ELSIF V_COMPARE >= F_NLSSORT(' ') AND V_COMPARE <= F_NLSSORT('F ') THEN
V_RETURN := V_RETURN || 'w';
ELSIF V_COMPARE >= F_NLSSORT('夕 ') AND V_COMPARE <= F_NLSSORT('R ') 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的人

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved