| 订阅 | 在线投稿
分享
 
 
当前位置: 王朝网络 >> 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、很多人有这种习...

 
 
 
需求 有些时候我们会有这样的需求,要求使用字母从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' 此参数在数据库建立之后不能修改。
󰈣󰈤
 
 
 
  免责声明:本文仅代表作者个人观点,与王朝网络无关。王朝网络登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述,其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
清纯漂亮的美女
甜美的佳人
都市丽人写真
郊外美女 春色怡人
夕阳无限好--明天有早晨
雪,还是雪
hk夏日
日暮陆家嘴
 
>>返回首页<<
 为你推荐
 
 
 转载本文
 UBB代码 HTML代码
复制到剪贴板...
 
 热帖排行
 
 
 
 
©2005- 王朝网络 版权所有