亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

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

2024-07-21 02:44:08
字體:
來源:轉載
供稿:網友

需求

有些時候我們會有這樣的需求,要求使用字母從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'

此參數在數據庫建立之后不能修改。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色偷偷噜噜噜亚洲男人| 成人激情视频免费在线| 亚洲精品久久久久久久久久久久| 国产精品视频一| 亚洲人成在线一二| 最近的2019中文字幕免费一页| 国产精品日韩在线观看| 欧美—级a级欧美特级ar全黄| 亚洲第一二三四五区| 久久777国产线看观看精品| 麻豆成人在线看| 国产美女扒开尿口久久久| 久久免费成人精品视频| 2020久久国产精品| 日韩高清有码在线| 久99久在线视频| 97在线看免费观看视频在线观看| 欧美激情视频一区二区三区不卡| 国产一区二区三区三区在线观看| 中文字幕亚洲综合| 久久网福利资源网站| 91精品国产91久久久久| 久久久精品在线观看| 国产欧美日韩91| 亚洲视频网站在线观看| 亚洲综合成人婷婷小说| 亚洲国产精品久久久久秋霞蜜臀| 国产精品第七十二页| 超薄丝袜一区二区| 日韩少妇与小伙激情| 亚洲精品美女在线观看播放| 久久这里只有精品视频首页| 国产精品视频99| 国产日产亚洲精品| 色中色综合影院手机版在线观看| 亚洲成色777777在线观看影院| 亚洲a成v人在线观看| 日韩成人av在线| 欧美午夜精品久久久久久浪潮| 亚洲日本成人女熟在线观看| 亚洲国产欧美精品| 久久电影一区二区| 日韩亚洲欧美中文高清在线| 亚洲va码欧洲m码| 中文字幕日韩av电影| 成人免费看黄网站| 亚洲欧美另类自拍| 国内精品久久久久伊人av| 亚洲女人被黑人巨大进入al| 55夜色66夜色国产精品视频| 在线视频欧美日韩精品| 中文字幕在线视频日韩| 国产亚洲精品91在线| 亚洲高清久久久久久| 久久久精品欧美| 久久精品国产精品亚洲| 91亚洲精品一区二区| 欧美成年人在线观看| 亚洲精品视频网上网址在线观看| 日本一欧美一欧美一亚洲视频| 日韩精品999| 综合国产在线视频| 97在线免费视频| 国产精品一区二区久久| 欧美一区二区影院| 欧美高清视频一区二区| 91久久精品日日躁夜夜躁国产| 欧美激情视频一区二区| 欧美精品videosex极品1| 欧美精品videos| 欧美一区三区三区高中清蜜桃| 欧美激情国产高清| 亚洲sss综合天堂久久| 欧美激情免费视频| 91日本在线观看| 亚洲美女免费精品视频在线观看| 国产成人久久久| 精品久久久久久久久久ntr影视| 中文字幕欧美日韩在线| 中文字幕一区二区三区电影| 九九九久久国产免费| 欧美视频在线观看 亚洲欧| 久久精品国产欧美激情| 亚洲人成77777在线观看网| 国产欧美精品一区二区| 久久久www成人免费精品张筱雨| 欧美激情视频网| 91av在线不卡| 精品久久久一区| 欧美三级免费观看| 亚洲国产欧美一区二区三区同亚洲| 日韩在线观看免费全| 亚洲色图校园春色| 国产精品免费观看在线| 亚洲国产成人精品电影| 日韩欧美在线视频| 国产精品视频男人的天堂| 欧美xxxx做受欧美| 中日韩午夜理伦电影免费| 91在线中文字幕| 欧美日韩免费在线观看| 国产91色在线|免| 8090理伦午夜在线电影| 亚洲大胆人体在线| 日韩激情在线视频| 91精品国产综合久久香蕉的用户体验| 精品久久久中文| 黑人狂躁日本妞一区二区三区| 在线播放亚洲激情| 亚洲精品国精品久久99热| 一本色道久久88精品综合| 日韩视频在线一区| 精品国内自产拍在线观看| 欧美综合激情网| 欧美性极品xxxx做受| 亚洲丝袜在线视频| 国产精品久久久久久久久久久久久| 国产亚洲aⅴaaaaaa毛片| 国产精品一区二区三区久久| 精品久久久久久亚洲国产300| 欧美激情亚洲激情| 久久精品青青大伊人av| 亚洲天堂第二页| 国产亚洲精品成人av久久ww| 久久人人爽人人爽爽久久| 日韩电影免费观看在线观看| 日韩电影免费观看在线观看| 在线观看日韩www视频免费| 俺也去精品视频在线观看| 亚洲电影中文字幕| 91九色蝌蚪国产| 影音先锋欧美精品| 亚洲一区二区少妇| 亚洲视频在线免费看| 91精品久久久久久久久中文字幕| 精品久久久久久国产| 欧美孕妇毛茸茸xxxx| 8x拔播拔播x8国产精品| 在线播放日韩专区| 国内偷自视频区视频综合| 日韩av123| 亚洲网站在线播放| 91久久精品国产91久久性色| 91网站在线免费观看| 91精品国产色综合| 国产脚交av在线一区二区| 成人av番号网| 亚洲国产精品资源| 欧美国产亚洲精品久久久8v| 欧美激情三级免费| 秋霞成人午夜鲁丝一区二区三区| 最新国产成人av网站网址麻豆| 日韩电影中文字幕| 一本大道香蕉久在线播放29| 在线视频中文亚洲| 91网在线免费观看| 国产精品爽黄69天堂a| 国产一区二区三区在线看| 国产成人免费av| 日本欧美一二三区| 欧美性高潮在线| 国产亚洲视频中文字幕视频| 操人视频在线观看欧美| 亚洲色在线视频|