您现在的位置是:首页 > 技术教程 正文

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

admin 阅读: 2024-03-26
后台-插件-广告管理-内容页头部广告(手机)

目录

应用场景

举例

函数实现

小结


应用场景

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

举例

假设有字典表,表名 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 编写与实现。 实际的应用中,还要结合原始输入进行查询,可以使用或条件,拼音码做为辅助查询条件。另外,对于大数据量的表,可以采用空间换时间的做法,增加字段,存储拼音简写值。可以通过在业务程序时,录入或修改功能实现,也可以通过触发器来实现。

以上观点仅供参考,欢迎大家指正,再次感谢您的阅读!

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索
排行榜