Microsoft SQL Server 编写汉字转拼音函数

打印 上一主题 下一主题

主题 993|帖子 993|积分 2979

目录
应用场景
举例
函数实现
小结


应用场景

在搜刮应用中,我们一样平常会提供一个搜刮框,输入关健字,点击查询按钮以获取效果数据。大部分环境我们会提供模糊查询的情势以在一个或多个字段举行搜刮以获取效果。这样可以简化用户的操作,扩大搜刮范围,为进步精度而提供基础范围数据。因此按汉字拼音搜刮,即可以进一步简化输入,又可以进一步扩大搜刮范围。
举例

假设有字典表,表名 sys_d,包括 ID 和 NAME 字段,我们要对 NAME 字段举行搜刮,如下图:

对于模糊搜刮,我们可以通过 like 来实现,比如我们想得到name字段中包罗“职称”的记录,如下图实行:

用拼音简码的情势,可以更加进一步的增加搜刮范围,并可以简化切换输入法的操作,比如输入 ZC,即可以找到字典表中的数据。 因此我们可以编写汉字转拼音的函数 GetPY 举行进一步操作,如下图:
 

 在搜刮时,我们通过该函数举行了一次转化,以得到预期效果,另外通过在查询字段列表里举行转化验证,可以看到 PY 字段对应 NAME 的拼音简写转化。
函数实现

打开SQL SERVER 查询分析器,实行如下代码:
  1. create function [dbo].[GetPY](@str varchar(500))
  2. returns varchar(500)
  3. as
  4. begin
  5.    declare @cyc int,@length int,@str1 varchar(100),@charcate varbinary(20)
  6.    set @cyc=1--从第几个字开始取
  7.    set @length=len(@str)--输入汉字的长度
  8.    set @str1=''--用于存放返回值
  9.    while @cyc<=@length
  10.        begin  
  11.           select @charcate=cast(substring(@str,@cyc,1) as varbinary)--每次取出一个字并将其转变成二进制,便于与GBK编码表进行比较
  12. if @charcate>=0XB0A1 and @charcate<=0XB0C4
  13.          set @str1=@str1+'A'--说明此汉字的首字母为A,以下同上
  14.     else if @charcate>=0XB0C5 and @charcate<=0XB2C0
  15.       set @str1=@str1+'B'
  16. else if @charcate>=0XB2C1 and @charcate<=0XB4ED
  17.       set @str1=@str1+'C'
  18. else if @charcate>=0XB4EE and @charcate<=0XB6E9
  19.       set @str1=@str1+'D'
  20. else if @charcate>=0XB6EA and @charcate<=0XB7A1
  21.                        set @str1=@str1+'E'
  22. else if @charcate>=0XB7A2 and @charcate<=0XB8C0
  23.              set @str1=@str1+'F'
  24. else if @charcate>=0XB8C1 and @charcate<=0XB9FD
  25.                        set @str1=@str1+'G'
  26. else if @charcate>=0XB9FE and @charcate<=0XBBF6
  27.        set @str1=@str1+'H'
  28. else if @charcate>=0XBBF7 and @charcate<=0XBFA5
  29.        set @str1=@str1+'J'
  30. else if @charcate>=0XBFA6 and @charcate<=0XC0AB
  31.        set @str1=@str1+'K'
  32. else if @charcate>=0XC0AC and @charcate<=0XC2E7
  33.        set @str1=@str1+'L'
  34. else if @charcate>=0XC2E8 and @charcate<=0XC4C2
  35.        set @str1=@str1+'M'
  36. else if @charcate>=0XC4C3 and @charcate<=0XC5B5
  37.        set @str1=@str1+'N'
  38.    else if @charcate>=0XC5B6 and @charcate<=0XC5BD
  39.        set @str1=@str1+'O'
  40. else if @charcate>=0XC5BE and @charcate<=0XC6D9
  41.        set @str1=@str1+'P'
  42. else if @charcate>=0XC6DA and @charcate<=0XC8BA
  43.        set @str1=@str1+'Q'
  44. else if @charcate>=0XC8BB and @charcate<=0XC8F5
  45.                    set @str1=@str1+'R'
  46. else if @charcate>=0XC8F6 and @charcate<=0XCBF9
  47.        set @str1=@str1+'S'
  48. else if @charcate>=0XCBFA and @charcate<=0XCDD9
  49.       set @str1=@str1+'T'
  50. else if @charcate>=0XCDDA and @charcate<=0XCEF3
  51.         set @str1=@str1+'W'
  52. else if @charcate>=0XCEF4 and @charcate<=0XD1B8
  53.         set @str1=@str1+'X'
  54. else if @charcate>=0XD1B9 and @charcate<=0XD4D0
  55.        set @str1=@str1+'Y'
  56. else if @charcate>=0XD4D1 and @charcate<=0XD7F9
  57.        set @str1=@str1+'Z'
  58. else
  59.            set @str1 =@str1 + substring(@str,@cyc,1)
  60.            set @str1= ltrim(rtrim(@str1        ))
  61.        set @cyc=@cyc+1--取出输入汉字的下一个字
  62. end
  63. return @str1--返回输入汉字的首字母
  64.        end
  65. GO
复制代码
GetPY函数必要传递 范例为varchar(500) 的字符串参数。
小结

以上代码基于 Microsoft SQL SERVER 2016 编写与实现。 实际的应用中,还要结合原始输入举行查询,可以利用或条件,拼音码做为辅助查询条件。另外,对于大数据量的表,可以接纳空间换时间的做法,增加字段,存储拼音简写值。可以通过在业务程序时,录入或修改功能实现,也可以通过触发器来实现。
以上观点仅供参考,欢迎大家指正,再次感谢您的阅读!





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

数据人与超自然意识

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表