You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 15:32:46