SQL Server多空格相似关键词匹配异常问题排查求助
问题分析:SQL Server无法捕获带空格的多词关键词
原代码的核心问题
- 错误拆分描述文本:使用
STRING_SPLIT(Description, ' ')将描述拆分为单个单词,直接破坏了带空格的多词关键词的完整性,导致无法匹配TableB中的短语(如canadian environment acts)。 - 字段名拼写错误:CASE语句中出现
ContentDescription、ColA等不存在的字段,应该对应Description、Word_A,这会导致匹配逻辑失效,返回NULL。 - 关联逻辑混乱:在拆分后的单词语表与TableB做关联,用
Description LIKE '%' + k.[Word_A] + '%'的条件完全冗余,且会产生大量重复匹配,干扰结果。 - 匹配逻辑错误:用单个单词去匹配多词关键词的前缀(
LOWER(keyword) LIKE LOWER(k.[Word_A]) + '%'),完全不符合多词短语的匹配需求;多词处理分支因字段错误无法正确截取目标短语。
修正后的SQL代码
WITH KeywordMatches AS ( SELECT a.ID, a.State, a.Description, -- 匹配Word_A的关键词 CASE WHEN a.Description LIKE '%' + k.Word_A + '%' THEN k.Word_A END AS MatchWordA, -- 匹配Word_B的关键词 CASE WHEN a.Description LIKE '%' + k.Word_B + '%' THEN k.Word_B END AS MatchWordB, -- 匹配Word_C的关键词 CASE WHEN a.Description LIKE '%' + k.Word_C + '%' THEN k.Word_C END AS MatchWordC FROM TableA a CROSS JOIN TableB k -- 过滤至少匹配一个关键词的行 WHERE a.Description LIKE '%' + k.Word_A + '%' OR a.Description LIKE '%' + k.Word_B + '%' OR a.Description LIKE '%' + k.Word_C + '%' ), AggregatedResults AS ( SELECT ID, State, Description, -- 聚合匹配到的Word_A关键词,去重 STRING_AGG(DISTINCT MatchWordA, ', ') AS keywords_A, -- 聚合匹配到的Word_B关键词,去重 STRING_AGG(DISTINCT MatchWordB, ', ') AS keywords_B, -- 聚合匹配到的Word_C关键词,去重 STRING_AGG(DISTINCT MatchWordC, ', ') AS keywords_C, -- 计算Word_A的总分:每个匹配的关键词得10分,去重后计数 SUM(DISTINCT CASE WHEN MatchWordA IS NOT NULL THEN 10 ELSE 0 END) AS ScoreA, -- 计算Word_B的总分:每个匹配的关键词得5分,去重后计数 SUM(DISTINCT CASE WHEN MatchWordB IS NOT NULL THEN 5 ELSE 0 END) AS ScoreB, -- 计算Word_C的总分:每个匹配的关键词得0.1分,去重后计数 SUM(DISTINCT CASE WHEN MatchWordC IS NOT NULL THEN 0.1 ELSE 0 END) AS ScoreC FROM KeywordMatches GROUP BY ID, State, Description ) SELECT ID, State, Description, -- 替换NULL或空字符串为更友好的显示 ISNULL(keywords_A, '无') AS keywords_A, ISNULL(keywords_B, '无') AS keywords_B, ISNULL(keywords_C, '无') AS keywords_C, -- 总得分 ScoreA + ScoreB + ScoreC AS TotalScore FROM AggregatedResults ORDER BY ID;
代码说明
- 直接关联匹配:用
CROSS JOIN将TableA的每一行与TableB的所有关键词行关联,直接检查描述是否包含完整的关键词(不管是否带空格)。 - 精准捕获关键词:通过
CASE WHEN直接返回匹配到的完整关键词,确保多词短语被正确识别。 - 去重聚合:使用
STRING_AGG(DISTINCT ...)避免同一关键词被重复统计,同时用SUM(DISTINCT ...)确保每个关键词只计算一次分数。 - 友好处理空值:用
ISNULL将空的关键词列替换为"无",提升结果可读性。
内容的提问来源于stack exchange,提问作者H K
相关产品推荐
相关产品推荐

