SQL字符串部分匹配提取问题求助:收款人姓名匹配查询优化
优化后的姓名匹配SQL方案
原代码的问题在于直接用带额外字符的完整收款人姓名去匹配登记姓名,而实际需求是从收款人姓名中提取最长的、能匹配登记姓名里独立姓名部分的子串。以下是优化方案:
核心逻辑
从收款人姓名(@string1)的最长可能有效子串开始(长度递减),逐个检查是否存在于登记姓名(@string2)中,且该子串是登记姓名里的独立单词(避免部分匹配,比如JOH匹配JOHN但并非完整姓名部分)。找到第一个符合条件的子串后立即返回,确保得到最长的匹配结果。
优化后的SQL代码
DECLARE @string1 VARCHAR(100) = 'JOHNC'; DECLARE @string2 VARCHAR(100) = 'MART JOHN KENNEDY'; DECLARE @result VARCHAR(100) = 'No common substring found.'; DECLARE @currentLen INT = LEN(@string1) - 1; -- 从长度减1开始尝试 -- 循环缩短子串长度,寻找最长匹配的独立单词 WHILE @currentLen >= 1 BEGIN DECLARE @subStr VARCHAR(100) = LEFT(@string1, @currentLen); -- 检查子串是否是独立单词:前后为空格,或在字符串开头/结尾 DECLARE @matchPattern VARCHAR(200) = '% ' + @subStr + ' %'; DECLARE @startPattern VARCHAR(200) = @subStr + ' %'; DECLARE @endPattern VARCHAR(200) = '% ' + @subStr; IF @string2 LIKE @matchPattern OR @string2 LIKE @startPattern OR @string2 LIKE @endPattern BEGIN SET @result = @subStr; BREAK; -- 找到最长匹配,退出循环 END SET @currentLen = @currentLen - 1; END PRINT @result;
代码说明
- 循环从收款人姓名长度减1开始,逐步缩短子串长度,优先匹配最长的有效姓名部分
- 使用
LIKE模式匹配,确保子串是登记姓名中的独立单词:% @subStr %:匹配中间的独立单词@subStr %:匹配开头的单词% @subStr:匹配结尾的单词
- 找到第一个符合条件的子串后立即退出循环,保证结果是最长的匹配项
内容的提问来源于stack exchange,提问作者Srini
相关产品推荐
相关产品推荐

