SQL Server 2014:统计两个字符串中的公共字符数
统计两个字符串中指定公共字符的数量(SQL实现)
问题分析
你当前的自定义函数仅遍历了0-9的数字,因此只能统计数字类公共字符,无法覆盖字母、空格和句点的需求。需要扩展遍历范围,同时处理大小写不敏感的场景(根据示例,CBOY和CellBoy的公共字符计数为4,说明大小写不区分)。
方法一:改进自定义函数
修改函数,遍历所有目标字符(数字0-9、字母A-Z、空格、句点),统一转大写后检查字符是否同时存在于两个字符串中:
ALTER FUNCTION [dbo].[CountCommonChars] ( @var1 VARCHAR(MAX), @var2 VARCHAR(MAX) ) RETURNS INT AS BEGIN DECLARE @count INT = 0; DECLARE @currentChar CHAR(1); DECLARE @pos INT = 0; -- 遍历数字 0-9 WHILE @pos <= 9 BEGIN SET @currentChar = CONVERT(CHAR(1), @pos); IF CHARINDEX(@currentChar, UPPER(@var1)) > 0 AND CHARINDEX(@currentChar, UPPER(@var2)) > 0 SET @count += 1; SET @pos += 1; END -- 遍历大写字母 A-Z SET @pos = 65; -- ASCII码:A=65 WHILE @pos <= 90 -- ASCII码:Z=90 BEGIN SET @currentChar = CHAR(@pos); IF CHARINDEX(@currentChar, UPPER(@var1)) > 0 AND CHARINDEX(@currentChar, UPPER(@var2)) > 0 SET @count += 1; SET @pos += 1; END -- 检查空格 IF CHARINDEX(' ', @var1) > 0 AND CHARINDEX(' ', @var2) > 0 SET @count += 1; -- 检查句点 IF CHARINDEX('.', @var1) > 0 AND CHARINDEX('.', @var2) > 0 SET @count += 1; RETURN @count; END
测试验证:
- 第1行:
dbo.CountCommonChars('1.5 FLOZ', '1.5 FLUID OUNCES')返回7 - 第2行:
dbo.CountCommonChars('CBOY', 'CellBoy')返回4
方法二:使用CTE实现(无需自定义函数)
通过CTE生成所有目标字符集合,再统计同时出现在两个字符串中的字符数量:
WITH TargetChars AS ( -- 生成数字 0-9 SELECT CONVERT(CHAR(1), number) AS char_val FROM master.dbo.spt_values WHERE type = 'P' AND number BETWEEN 0 AND 9 UNION ALL -- 生成大写字母 A-Z SELECT CHAR(number) AS char_val FROM master.dbo.spt_values WHERE type = 'P' AND number BETWEEN 65 AND 90 UNION ALL -- 添加空格和句点 SELECT ' ' UNION ALL SELECT '.' ) SELECT ColumnA, ColumnB, ( SELECT COUNT(*) FROM TargetChars tc WHERE CHARINDEX(tc.char_val, UPPER(ColumnA)) > 0 AND CHARINDEX(tc.char_val, UPPER(ColumnB)) > 0 ) AS CommonCharCount FROM YourTableName; -- 替换为你的表名
说明:
- 若需要区分大小写,移除
UPPER()函数即可 master.dbo.spt_values是系统自带的序列表,若无法使用,可替换为递归CTE生成数字序列- 该方式无需创建函数,直接查询即可得到结果
内容的提问来源于stack exchange,提问作者Azor Ahai
相关产品推荐
相关产品推荐

