SQL Server 中获取字符串拼音的标量函数实现
工作中时常遇到字符串转换为拼音的需求。特别目前在各大网站平台都可以看到的基于拼音的查询功能。如果在查询中增加相应的拼音查询,就可以减少很多的因中文汉字完全输入的不便利,例如:当我要查询叫”郭德纲“人员时,直接输入"GDG"即可,这样是不是比较方便输入。
中文汉字有个特点:同字不同音 。在不同的语境或中文汉字组合时,会出现不同的读法。比如:参加会议中的”参“和中药材人参中“参”是两个不同的读音,诸如这样的中文汉字有不少的。本版块的实现也存在这样的问题。可以通过项目或平台基于使用中文多音字的频率来选择同一的转换,比如说:你所在的公司是中药材有关的行业,就可以将“参”对应的字母匹配为“S";如果你所在的公司具有起人名的业务,可以将中文汉字”查“(姓氏读查,如查良庸----起笔名为金庸)的字母匹配为”C“等等。
1 IF OBJECT_ID(N'dbo.ufn_Pinyin', N'FN') IS NOT NULL 2 BEGIN 3 DROP FUNCTION dbo.ufn_Pinyin; 4 END 5 GO 6 7 --================================== 8 -- 功能: 获取字符串的拼音 9 -- 说明: 针对中文汉字的多音字情况,可以在函数中增加多音字的字母匹配,缺点就是以后遇到该中文汉字不论其作出语境如何都会按照其多音字的字母匹配。 10 -- 作者: XXX 11 -- 创建: XXXX-XX-XX 12 -- 修改: XXX-XXX-XX XXX XXXXXXXX 13 -- 调用: SELECT dbo.ufn_Pinyin(N'中国') AS Pinyin; 14 --================================== 15 CREATE FUNCTION dbo.ufn_Pinyin 16 ( 17 @chvnStr NVARCHAR(4000) -- 字符串 18 ) RETURNS NVARCHAR(4000) 19 --$Encode$-- 20 AS 21 BEGIN 22 -- NULL默认值处理 23 SET @chvnStr = ISNULL(@chvnStr, N''); 24 25 -- 声明局部变量 26 DECLARE 27 @intLen AS INT, 28 @chvnPinyin AS NVARCHAR(4000), 29 @chnCharacter AS NCHAR(1); 30 -- 初始化局部变量 31 SELECT 32 @intLen = 0, 33 @chvnPinyin = N'', 34 @chnCharacter = N''; 35 36 -- 插入的字符串为空字符串则直接返回该函数 37 IF @chvnStr = N'' 38 BEGIN 39 RETURN @chvnPinyin; 40 END 41 42 -- 声明中文汉字的局部表变量 43 DECLARE @tblChineseCharacter TABLE ( 44 ChineseCharacter NCHAR(1) COLLATE Chinese_PRC_CI_AS NOT NULL, 45 Letter NCHAR(1) NOT NULL 46 ); 47 48 -- 向中文汉字的局部表变量插入数据 49 INSERT INTO @tblChineseCharacter (ChineseCharacter, Letter) 50 SELECT N'吖', N'A' UNION ALL SELECT N'八', 'B' UNION ALL SELECT N'嚓', 'C' UNION ALL SELECT N'咑', N'D' UNION ALL 51 SELECT N'妸', N'E' UNION ALL SELECT N'发', 'F' UNION ALL SELECT N'旮', 'G' UNION ALL SELECT N'铪', N'H' UNION ALL 52 SELECT N'丌', N'J' UNION ALL SELECT N'咔', 'K' UNION ALL SELECT N'垃', 'L' UNION ALL SELECT N'嘸', N'M' UNION ALL 53 SELECT N'拏', N'N' UNION ALL SELECT N'噢', 'O' UNION ALL SELECT N'妑', 'P' UNION ALL SELECT N'七', N'Q' UNION ALL 54 SELECT N'呥', N'R' UNION ALL SELECT N'仨', 'S' UNION ALL SELECT N'他', 'T' UNION ALL SELECT N'屲', N'W' UNION ALL 55 SELECT N'夕', N'X' UNION ALL SELECT N'丫', 'Y' UNION ALL SELECT N'帀', 'Z' UNION ALL SELECT N'参', N'S' /*增加多音字的字母匹配*/; 56 57 -- 获取字符串的长度 58 SET @intLen= LEN(@chvnStr); 59 60 WHILE @intLen >= 1 /*@intLen > 0*/ 61 BEGIN 62 -- 从后往前逐次获取单个字符 63 SET @chnCharacter = SUBSTRING(@chvnStr, @intLen, 1); 64 65 -- 获取当前字符对应的字母 66 SELECT TOP 1 @chvnPinyin = Letter + @chvnPinyin 67 FROM @tblChineseCharacter 68 WHERE ChineseCharacter <= @chnCharacter 69 ORDER BY ChineseCharacter DESC; 70 71 -- 如果当前受影响的行数为0,则表示当前字符可能是中文外的其他字符,如英文字符等等 72 IF @@ROWCOUNT = 0 73 BEGIN 74 SET @chvnPinyin = SUBSTRING(@chvnStr, @intLen, 1) + @chvnPinyin; 75 END 76 77 -- 字符串长度局部变量递减 78 SET @intLen = @intLen - 1; 79 END 80 81 RETURN @chvnPinyin; 82 END 83 GO
演示该函数的效果,如下的T-SQL:
1 SELECT dbo.ufn_Pinyin(N'中国') AS ColName,dbo.ufn_Pinyin(N'中国ilove你') AS Col2Name, dbo.ufn_Pinyin(N'中国我爱你') AS Col3Name; 2 GO
执行的后的查询结果如下:
![](https://images2015.cnblogs.com/blog/82100/201512/82100-20151218103352193-1159724460.png)
博友有解决中文多音字的拼音字母匹配的好方案,也请不吝赐教,万分感谢。
注意:该以上实现如果存在侵权,也请原作者提出来,谢谢。