用Oracle的NLSSORT獲取拼音首字母

qdrzq發表於2015-01-12

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

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29512902/viewspace-1399416/,如需轉載,請註明出處,否則將追究法律責任。

相關文章