| 導購 | 订阅 | 在线投稿
分享
 
 
當前位置: 王朝網路 >> mssql >> DB2中創建一個獲取漢字拼音首字母的SQL函數
 

DB2中創建一個獲取漢字拼音首字母的SQL函數

2008-07-17 07:48:18  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
 
  需求

  有些時候我們會有這樣的需求,要求使用字母從a至z對一組數據進行索引,如果數據的格式全部是半角的英文則很容易實現,但若是對一組中文數據進行索引則會引起一點小的麻煩,數據在錄入數據庫的時候可能並沒有指定一個索引字母,這就要求應用程序可以自動生成用于索引的信息。

  一般對于中文數據的索引,采用詞組的首漢字拼音的首字母,例如:

  詞組 索引字母

  --- -----

  熊貓 x

  白暨豚 b

  藏野驢 z

  在DB2中並沒有提供相應的函數可以取得漢字拼音的首字母,我們可以利用數據庫針對中文字符集的排序功能創建一個這樣的函數。

  工作原理

  我們知道在使用中文字符集的數據庫中,當你對一列中文數據使用order by 排序時,排序的結果正是按照每行記錄第一個漢字的拼音首字母進行排列的,那麽我們需要想辦法取得這個字母。

  但是數據庫內部是如何做到這一點的呢?以中文字符集GBK爲例,讓我們查看一下GBK字符集的內碼表,我們僅摘出一段:

  0 1 2 3 4 5 6 7 8 9 A B C D E F

  B040 癅 癆 癇 癈 癉 癊 癋 癎 癏 癐 癑 癒 癓 癕 癗 癘

  B050 癙 癚 癛 癝 癟 癠 癡 癢 癤 癥 癦 癧 癨 癩 癪 癬

  B060 癭 癮 癰 癱 癲 癳 癴 癵 癶 癷 癹 発 發 癿 皀 皁

  B070 皃 皅 皉 皊 皌 皍 皏 皐 皒 皔 皕 皗 皘 皚 皛

  B080 皜 皝 皞 皟 皠 皡 皢 皣 皥 皦 皧 皨 皩 皪 皫 皬

  B090 皭 皯 皰 皳 皵 皶 皷 皸 皹 皺 皻 皼 皽 皾 盀 盁

  B0A0 盃 啊 阿 埃 挨 哎 唉 哀 皚 癌 藹 矮 艾 礙 愛 隘

  B0B0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翺

  B0C0 襖 傲 奧 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋

  B0D0 靶 把 耙 壩 霸 罷 爸 白 柏 百 擺 佰 敗 拜 稗 斑

  B0E0 班 搬 扳 般 頒 板 版 扮 拌 伴 瓣 半 辦 絆 邦 幫

  B0F0 梆 榜 膀 綁 棒 磅 蚌 鎊 傍 謗 苞 胞 包 褒 剝

  可以看到從B0A0-1 開始,至B0C0-5,是拼音A開頭的漢字,恰好是按照拼音字母的先後順序排列,並且把音調的因素也考慮進去了,由此,可以推斷出,數據庫在GBk編碼的數據庫中對漢字進行排序,即是依照字符內碼表的編碼進行的。

  我們把B0C0-5 位置的漢字記錄下來,即「澳」字,這是以「a」拼音開頭在內碼表中排列在最後的漢字,用同樣的方法,我們找出所有以拼音從b至z開頭,在內碼表中排列在最後的漢字,與26個字母的對應關系如下:

  '澳' a

  '怖' b

  '錯' c

  '墮' d

  '貳' e

  '咐' f

  '過' g

  '禍' h

  i

  '駿' j

  '闊' k

  '絡' l

  '穆' m

  '諾' n

  '漚' o

  '瀑' p

  '群' q

  '弱' r

  '所' s

  '唾' t

  u

  v

  '誤' w

  '迅' x

  '孕' y

  '座 z

  注:沒有以'i','u','v'開頭的漢語拼音。

  現在假若我們拿出任何一個漢字,放在我們挑選出的這些漢字中間,利用數據庫進行一次使用GBK字符集的排序,我們便能夠根據這個漢字排列的相對位置得到其拼音首字母。

  利用sql語句生成一組上述漢字的結果集,我們將'i','u','v' 三個空缺漢字的位置補上了上一個拼音的漢字,

  select t1.strChn

  from ( select '澳' strChn from sysibm.sysdummy1

  union all

  select '怖' strChn from sysibm.sysdummy1

  union all

  select '錯' strChn from sysibm.sysdummy1

  union all

  select '墮' strChn from sysibm.sysdummy1

  union all

  select '貳' strChn from sysibm.sysdummy1

  union all

  select '咐' strChn from sysibm.sysdummy1

  union all

  select '過' strChn from sysibm.sysdummy1

  union all

  select '禍' strChn from sysibm.sysdummy1

  union all

  select '禍' strChn from sysibm.sysdummy1

  union all

  select '駿' strChn from sysibm.sysdummy1

  union all

  select '闊' strChn from sysibm.sysdummy1

  union all

  select '絡' strChn from sysibm.sysdummy1

  union all

  select '穆' strChn from sysibm.sysdummy1

  union all

  select '諾' strChn from sysibm.sysdummy1

  union all

  select '漚' strChn from sysibm.sysdummy1

  union all

  select '瀑' strChn from sysibm.sysdummy1

  union all

  select '群' strChn from sysibm.sysdummy1

  union all

  select '弱' strChn from sysibm.sysdummy1

  union all

  select '所' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '誤' strChn from sysibm.sysdummy1

  union all

  select '迅' strChn from sysibm.sysdummy1

  union all

  select '孕' strChn from sysibm.sysdummy1

  union all

  select '座' strChn from sysibm.sysdummy1

  ) as t1

  實現

  接下來很方便的就可以寫出這個函數的具體實現,在實現的代碼中,我們又加入了針對英文字母的處理,函數編譯後,可通過如下方式調用:

  select getIndex( '索' ) index from dual;

  index

  ------

  f

  原代碼如下:

  create function getIndex (

  in_strChn varchar(2)

  ) returns char(1)

  language sql

  external action

  reads sql data

  begin atomic

  declare chResult char(1);

  declare n integer default 0;

  if( in_strChn = '' or in_strChn is null or lengthb( in_strChn ) > 2 ) then

  return null;

  end if;

  if(( ascii( in_strChn ) >= ascii('A') and ascii( in_strChn ) <= ascii('Z') )

  or ( ascii( in_strChn ) >= ascii('a') and ascii( in_strChn ) <= ascii('z')) ) then

  return lcase( substr( in_strChn, 1, 1 ) );

  end if;

  for myloop as

  select t2.strChn

  from ( select t1.strChn

  from ( select '澳' strChn from sysibm.sysdummy1

  union all

  select '怖' strChn from sysibm.sysdummy1

  union all

  select '錯' strChn from sysibm.sysdummy1

  union all

  select '墮' strChn from sysibm.sysdummy1

  union all

  select '貳' strChn from sysibm.sysdummy1

  union all

  select '咐' strChn from sysibm.sysdummy1

  union all

  select '過' strChn from sysibm.sysdummy1

  union all

  select '禍' strChn from sysibm.sysdummy1

  union all

  select '禍' strChn from sysibm.sysdummy1

  union all

  select '駿' strChn from sysibm.sysdummy1

  union all

  select '闊' strChn from sysibm.sysdummy1

  union all

  select '絡' strChn from sysibm.sysdummy1

  union all

  select '穆' strChn from sysibm.sysdummy1

  union all

  select '諾' strChn from sysibm.sysdummy1

  union all

  select '漚' strChn from sysibm.sysdummy1

  union all

  select '瀑' strChn from sysibm.sysdummy1

  union all

  select '群' strChn from sysibm.sysdummy1

  union all

  select '弱' strChn from sysibm.sysdummy1

  union all

  select '所' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '唾' strChn from sysibm.sysdummy1

  union all

  select '誤' strChn from sysibm.sysdummy1

  union all

  select '迅' strChn from sysibm.sysdummy1

  union all

  select '孕' strChn from sysibm.sysdummy1

  union all

  select '座' strChn from sysibm.sysdummy1

  union all

  select in_strChn strChn from sysibm.sysdummy1

  ) as t1

  order by t1.strChn

  ) as t2

  do

  if ( strChn = in_strChn ) then

  set chResult = chr( ascii('a') + ( case n when 26 then n-1 else n end ) );

  return chResult;

  end if;

  set n = n + 1;

  end for;

  return chResult;

  end@

  實際使用中,應注意建立數據庫時字符集參數的設置,應使用GBK字符集。

  應用以下命令查看已建立數據庫的字符集:

  db2 connect to db_name user user_name using password

  db2 get db cfg | grep -i 'code set'

  此參數在數據庫建立之後不能修改。
 
 
 
上一篇《另類解讀SQL Server中的DateTime數據類型》
下一篇《實例講解實現SQL下的字符串拆分具體方法》
 
 
 
日版寵物情人插曲《Winding Road》歌詞

日版寵物情人2017的插曲,很帶節奏感,日語的,女生唱的。 最後聽見是在第8集的時候女主手割傷了,然後男主用嘴幫她吸了一下,插曲就出來了。 歌手:Def...

兄弟共妻,我成了他們夜裏的美食

老鍾家的兩個兒子很特別,就是跟其他的人不太一樣,魔一般的執著。兄弟倆都到了要結婚的年齡了,不管自家老爹怎麽磨破嘴皮子,兄弟倆說不娶就不娶,老父母爲兄弟兩操碎了心...

如何磨出破洞牛仔褲?牛仔褲怎麽剪破洞?

把牛仔褲磨出有線的破洞 1、具體工具就是磨腳石,下面墊一個硬物,然後用磨腳石一直磨一直磨,到把那塊磨薄了,用手撕開就好了。出來的洞啊很自然的。需要貓須的話調幾...

我就是掃描下圖得到了敬業福和愛國福

先來看下敬業福和愛國福 今年春節,支付寶再次推出了“五福紅包”活動,表示要“把欠大家的敬業福都還給大家”。 今天該活動正式啓動,和去年一樣,需要收集“五福”...

冰箱異味産生的原因和臭味去除的方法

有時候我們打開冰箱就會聞到一股異味,冰箱裏的這種異味是因爲一些物質發出的氣味的混合體,聞起來讓人惡心。 産生這些異味的主要原因有以下幾點。 1、很多人有這種習...

《極品家丁》1-31集大結局分集劇情介紹

簡介 《極品家丁》講述了現代白領林晚榮無意回到古代金陵,並追隨蕭二小姐化名“林三”進入蕭府,不料卻陰差陽錯上演了一出低級家丁拼搏上位的“林三升職記”。...

李溪芮《極品家丁》片尾曲《你就是我最愛的寶寶》歌詞

你就是我最愛的寶寶 - 李溪芮 (電視劇《極品家丁》片尾曲) 作詞:常馨內 作曲:常馨內 你的眉 又鬼馬的挑 你的嘴 又壞壞的笑 上一秒吵鬧 下...

烏梅的功效與作用以及烏梅的食用禁忌有哪些?

烏梅,又稱春梅,中醫認爲,烏梅味酸,性溫,無毒,具有安心、除熱、下氣、祛痰、止渴調中、殺蟲的功效,治肢體痛、肺痨病。烏梅泡水喝能治傷寒煩熱、止吐瀉,與幹姜一起制...

什麽是脂肪粒?如何消除臉部脂肪粒?

什麽是脂肪粒 在我們的臉上總會長一個個像脂肪的小顆粒,弄也弄不掉,而且顔色還是白白的。它既不是粉刺也不是其他的任何痘痘,它就是脂肪粒。 脂肪粒雖然也是由油脂...

網絡安全治理:國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰受害者

來源:中國青年報 新的攻擊方法不斷湧現,黑客幾乎永遠占據網絡攻擊的上風,我們不可能通過技術手段杜絕網絡攻擊。國家安全保障的主要方向是打擊犯罪,而不是處置和懲罰...

 
 
 
需求 有些時候我們會有這樣的需求,要求使用字母從a至z對一組數據進行索引,如果數據的格式全部是半角的英文則很容易實現,但若是對一組中文數據進行索引則會引起一點小的麻煩,數據在錄入數據庫的時候可能並沒有指定一個索引字母,這就要求應用程序可以自動生成用于索引的信息。 一般對于中文數據的索引,采用詞組的首漢字拼音的首字母,例如: 詞組 索引字母 --- ----- 熊貓 x 白暨豚 b 藏野驢 z 在DB2中並沒有提供相應的函數可以取得漢字拼音的首字母,我們可以利用數據庫針對中文字符集的排序功能創建一個這樣的函數。 工作原理 我們知道在使用中文字符集的數據庫中,當你對一列中文數據使用order by 排序時,排序的結果正是按照每行記錄第一個漢字的拼音首字母進行排列的,那麽我們需要想辦法取得這個字母。 但是數據庫內部是如何做到這一點的呢?以中文字符集GBK爲例,讓我們查看一下GBK字符集的內碼表,我們僅摘出一段: 0 1 2 3 4 5 6 7 8 9 A B C D E F B040 癅 癆 癇 癈 癉 癊 癋 癎 癏 癐 癑 癒 癓 癕 癗 癘 B050 癙 癚 癛 癝 癟 癠 癡 癢 癤 癥 癦 癧 癨 癩 癪 癬 B060 癭 癮 癰 癱 癲 癳 癴 癵 癶 癷 癹 発 發 癿 皀 皁 B070 皃 皅 皉 皊 皌 皍 皏 皐 皒 皔 皕 皗 皘 皚 皛 B080 皜 皝 皞 皟 皠 皡 皢 皣 皥 皦 皧 皨 皩 皪 皫 皬 B090 皭 皯 皰 皳 皵 皶 皷 皸 皹 皺 皻 皼 皽 皾 盀 盁 B0A0 盃 啊 阿 埃 挨 哎 唉 哀 皚 癌 藹 矮 艾 礙 愛 隘 B0B0 鞍 氨 安 俺 按 暗 岸 胺 案 肮 昂 盎 凹 敖 熬 翺 B0C0 襖 傲 奧 懊 澳 芭 捌 扒 叭 吧 笆 八 疤 巴 拔 跋 B0D0 靶 把 耙 壩 霸 罷 爸 白 柏 百 擺 佰 敗 拜 稗 斑 B0E0 班 搬 扳 般 頒 板 版 扮 拌 伴 瓣 半 辦 絆 邦 幫 B0F0 梆 榜 膀 綁 棒 磅 蚌 鎊 傍 謗 苞 胞 包 褒 剝 可以看到從B0A0-1 開始,至B0C0-5,是拼音A開頭的漢字,恰好是按照拼音字母的先後順序排列,並且把音調的因素也考慮進去了,由此,可以推斷出,數據庫在GBk編碼的數據庫中對漢字進行排序,即是依照字符內碼表的編碼進行的。 我們把B0C0-5 位置的漢字記錄下來,即「澳」字,這是以「a」拼音開頭在內碼表中排列在最後的漢字,用同樣的方法,我們找出所有以拼音從b至z開頭,在內碼表中排列在最後的漢字,與26個字母的對應關系如下: '澳' a '怖' b '錯' c '墮' d '貳' e '咐' f '過' g '禍' h i '駿' j '闊' k '絡' l '穆' m '諾' n '漚' o '瀑' p '群' q '弱' r '所' s '唾' t u v '誤' w '迅' x '孕' y '座 z 注:沒有以'i','u','v'開頭的漢語拼音。 現在假若我們拿出任何一個漢字,放在我們挑選出的這些漢字中間,利用數據庫進行一次使用GBK字符集的排序,我們便能夠根據這個漢字排列的相對位置得到其拼音首字母。 利用sql語句生成一組上述漢字的結果集,我們將'i','u','v' 三個空缺漢字的位置補上了上一個拼音的漢字, select t1.strChn from ( select '澳' strChn from sysibm.sysdummy1 union all select '怖' strChn from sysibm.sysdummy1 union all select '錯' strChn from sysibm.sysdummy1 union all select '墮' strChn from sysibm.sysdummy1 union all select '貳' strChn from sysibm.sysdummy1 union all select '咐' strChn from sysibm.sysdummy1 union all select '過' strChn from sysibm.sysdummy1 union all select '禍' strChn from sysibm.sysdummy1 union all select '禍' strChn from sysibm.sysdummy1 union all select '駿' strChn from sysibm.sysdummy1 union all select '闊' strChn from sysibm.sysdummy1 union all select '絡' strChn from sysibm.sysdummy1 union all select '穆' strChn from sysibm.sysdummy1 union all select '諾' strChn from sysibm.sysdummy1 union all select '漚' strChn from sysibm.sysdummy1 union all select '瀑' strChn from sysibm.sysdummy1 union all select '群' strChn from sysibm.sysdummy1 union all select '弱' strChn from sysibm.sysdummy1 union all select '所' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '誤' strChn from sysibm.sysdummy1 union all select '迅' strChn from sysibm.sysdummy1 union all select '孕' strChn from sysibm.sysdummy1 union all select '座' strChn from sysibm.sysdummy1 ) as t1 實現 接下來很方便的就可以寫出這個函數的具體實現,在實現的代碼中,我們又加入了針對英文字母的處理,函數編譯後,可通過如下方式調用: select getIndex( '索' ) index from dual; index ------ f 原代碼如下: create function getIndex ( in_strChn varchar(2) ) returns char(1) language sql external action reads sql data begin atomic declare chResult char(1); declare n integer default 0; if( in_strChn = '' or in_strChn is null or lengthb( in_strChn ) > 2 ) then return null; end if; if(( ascii( in_strChn ) >= ascii('A') and ascii( in_strChn ) <= ascii('Z') ) or ( ascii( in_strChn ) >= ascii('a') and ascii( in_strChn ) <= ascii('z')) ) then return lcase( substr( in_strChn, 1, 1 ) ); end if; for myloop as select t2.strChn from ( select t1.strChn from ( select '澳' strChn from sysibm.sysdummy1 union all select '怖' strChn from sysibm.sysdummy1 union all select '錯' strChn from sysibm.sysdummy1 union all select '墮' strChn from sysibm.sysdummy1 union all select '貳' strChn from sysibm.sysdummy1 union all select '咐' strChn from sysibm.sysdummy1 union all select '過' strChn from sysibm.sysdummy1 union all select '禍' strChn from sysibm.sysdummy1 union all select '禍' strChn from sysibm.sysdummy1 union all select '駿' strChn from sysibm.sysdummy1 union all select '闊' strChn from sysibm.sysdummy1 union all select '絡' strChn from sysibm.sysdummy1 union all select '穆' strChn from sysibm.sysdummy1 union all select '諾' strChn from sysibm.sysdummy1 union all select '漚' strChn from sysibm.sysdummy1 union all select '瀑' strChn from sysibm.sysdummy1 union all select '群' strChn from sysibm.sysdummy1 union all select '弱' strChn from sysibm.sysdummy1 union all select '所' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '唾' strChn from sysibm.sysdummy1 union all select '誤' strChn from sysibm.sysdummy1 union all select '迅' strChn from sysibm.sysdummy1 union all select '孕' strChn from sysibm.sysdummy1 union all select '座' strChn from sysibm.sysdummy1 union all select in_strChn strChn from sysibm.sysdummy1 ) as t1 order by t1.strChn ) as t2 do if ( strChn = in_strChn ) then set chResult = chr( ascii('a') + ( case n when 26 then n-1 else n end ) ); return chResult; end if; set n = n + 1; end for; return chResult; end@ 實際使用中,應注意建立數據庫時字符集參數的設置,應使用GBK字符集。 應用以下命令查看已建立數據庫的字符集: db2 connect to db_name user user_name using password db2 get db cfg | grep -i 'code set' 此參數在數據庫建立之後不能修改。
󰈣󰈤
 
 
 
  免責聲明:本文僅代表作者個人觀點,與王朝網路無關。王朝網路登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
 
微光夜曲_朦胧的美
青春校園_女生娜娜
氣質佳人_唯美動人
新年時尚魅力女生
痞子的甘南日記
疑是銀河落九天
雪域壩上四——純美色
冬日戀歌——西城楊柳弄輕柔
 
>>返回首頁<<
 
 熱帖排行
 
 
 
 
© 2005- 王朝網路 版權所有