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

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介: Microsoft SQL Server 编写汉字转拼音函数

应用场景

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

举例

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

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

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

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

函数实现

打开SQL SERVER 查询分析器,执行如下代码:

 
 
create function [dbo].[GetPY](@str varchar(500))
returns varchar(500)
as
begin
   declare @cyc int,@length int,@str1 varchar(100),@charcate varbinary(20)
   set @cyc=1--从第几个字开始取
   set @length=len(@str)--输入汉字的长度
   set @str1=''--用于存放返回值
   while @cyc<=@length
       begin  
          select @charcate=cast(substring(@str,@cyc,1) as varbinary)--每次取出一个字并将其转变成二进制,便于与GBK编码表进行比较
 if @charcate>=0XB0A1 and @charcate<=0XB0C4
         set @str1=@str1+'A'--说明此汉字的首字母为A,以下同上
    else if @charcate>=0XB0C5 and @charcate<=0XB2C0
      set @str1=@str1+'B'
 else if @charcate>=0XB2C1 and @charcate<=0XB4ED
      set @str1=@str1+'C'
 else if @charcate>=0XB4EE and @charcate<=0XB6E9
      set @str1=@str1+'D'
 else if @charcate>=0XB6EA and @charcate<=0XB7A1
                       set @str1=@str1+'E'
 else if @charcate>=0XB7A2 and @charcate<=0XB8C0
             set @str1=@str1+'F'
 else if @charcate>=0XB8C1 and @charcate<=0XB9FD
                       set @str1=@str1+'G'
 else if @charcate>=0XB9FE and @charcate<=0XBBF6
       set @str1=@str1+'H'
 else if @charcate>=0XBBF7 and @charcate<=0XBFA5
       set @str1=@str1+'J'
 else if @charcate>=0XBFA6 and @charcate<=0XC0AB
       set @str1=@str1+'K'
 else if @charcate>=0XC0AC and @charcate<=0XC2E7
       set @str1=@str1+'L'
 else if @charcate>=0XC2E8 and @charcate<=0XC4C2
       set @str1=@str1+'M'
 else if @charcate>=0XC4C3 and @charcate<=0XC5B5
       set @str1=@str1+'N'
   else if @charcate>=0XC5B6 and @charcate<=0XC5BD
       set @str1=@str1+'O'
 else if @charcate>=0XC5BE and @charcate<=0XC6D9
       set @str1=@str1+'P'
 else if @charcate>=0XC6DA and @charcate<=0XC8BA
       set @str1=@str1+'Q'
 else if @charcate>=0XC8BB and @charcate<=0XC8F5
                   set @str1=@str1+'R'
 else if @charcate>=0XC8F6 and @charcate<=0XCBF9
       set @str1=@str1+'S'
 else if @charcate>=0XCBFA and @charcate<=0XCDD9
      set @str1=@str1+'T'
 else if @charcate>=0XCDDA and @charcate<=0XCEF3
        set @str1=@str1+'W'
 else if @charcate>=0XCEF4 and @charcate<=0XD1B8
        set @str1=@str1+'X'
 else if @charcate>=0XD1B9 and @charcate<=0XD4D0
       set @str1=@str1+'Y'
 else if @charcate>=0XD4D1 and @charcate<=0XD7F9
       set @str1=@str1+'Z'
 else 
     set @str1 =@str1 + substring(@str,@cyc,1)
     set @str1= ltrim(rtrim(@str1 ))
       set @cyc=@cyc+1--取出输入汉字的下一个字
 end
 return @str1--返回输入汉字的首字母
 
       end
 
 
 
GO
 
 

GetPY函数需要传递 类型为varchar(500) 的字符串参数。

小结

以上代码基于 Microsoft SQL SERVER 2016 编写与实现。 实际的应用中,还要结合原始输入进行查询,可以使用或条件,拼音码做为辅助查询条件。另外,对于大数据量的表,可以采用空间换时间的做法,增加字段,存储拼音简写值。可以通过在业务程序时,录入或修改功能实现,也可以通过触发器来实现。

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

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS&nbsp;SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/sqlserver
相关文章
|
22天前
|
SQL
简单练习Microsoft SQL Server MERGE同步两个表
【10月更文挑战第13天】本文介绍了在Microsoft SQL Server中使用`MERGE`语句同步两个表的步骤。首先创建源表`SourceTable`和目标表`TargetTable`并分别插入数据,然后通过`MERGE`语句根据ID匹配行,实现更新、插入和删除操作,最后验证同步结果。此方法可根据需求调整以适应不同场景。
|
13天前
|
SQL Oracle 关系型数据库
SQL优化-使用联合索引和函数索引
在一次例行巡检中,发现一条使用 `to_char` 函数将日期转换为字符串的 SQL 语句 CPU 利用率很高。为了优化该语句,首先分析了 where 条件中各列的选择性,并创建了不同类型的索引,包括普通索引、函数索引和虚拟列索引。通过对比不同索引的执行计划,最终确定了使用复合索引(包含函数表达式)能够显著降低查询成本,提高执行效率。
|
19天前
|
SQL 数据库 数据库管理
数据库SQL函数应用技巧与方法
在数据库管理中,SQL函数是处理和分析数据的强大工具
|
20天前
|
SQL 数据库 索引
SQL中COUNT函数结合条件使用的技巧与方法
在SQL查询中,COUNT函数是一个非常常用的聚合函数,用于计算表中满足特定条件的记录数
|
20天前
|
SQL 关系型数据库 MySQL
SQL日期函数
SQL日期函数
|
2月前
|
关系型数据库 MySQL 网络安全
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
5-10Can't connect to MySQL server on 'sh-cynosl-grp-fcs50xoa.sql.tencentcdb.com' (110)")
|
2月前
|
SQL 关系型数据库 C语言
PostgreSQL SQL扩展 ---- C语言函数(三)
可以用C(或者与C兼容,比如C++)语言编写用户自定义函数(User-defined functions)。这些函数被编译到动态可加载目标文件(也称为共享库)中并被守护进程加载到服务中。“C语言函数”与“内部函数”的区别就在于动态加载这个特性,二者的实际编码约定本质上是相同的(因此,标准的内部函数库为用户自定义C语言函数提供了丰富的示例代码)
|
3月前
|
SQL 数据库
Microsoft SQL Server 2014如何来备份数据库
Microsoft SQL Server 2014如何来备份数据库
266 3
|
3月前
|
SQL 数据处理 数据库
|
3月前
|
SQL Oracle 关系型数据库
SQL 中的大小写处理函数详解
【8月更文挑战第31天】
103 0