SSMS中如何对比两列文本判断某列字符串是否存在于另一列
地址包含关系判断解决方案
基础精确匹配方案
你要实现「判断处理后的手动录入地址是否为系统地址子串」的需求,直接用SQL Server内置的字符匹配函数即可,无需固定截取字符长度,两种常用写法如下:
- 使用
CHARINDEX函数(返回子串在目标字符串的起始位置,找不到返回0):
CASE WHEN CHARINDEX(TidyManualAddress, CorrectedAddress) > 0 THEN 'Y' ELSE 'N' END AS AddressMatch
- 使用
LIKE模糊匹配:
CASE WHEN CorrectedAddress LIKE '%' + TidyManualAddress + '%' THEN 'Y' ELSE 'N' END AS AddressMatch
以上两种写法都可以覆盖你举的示例场景:当CorrectedAddress为MovingPlace,MadeUpTown,SomeCountry、TidyManualAddress为MovingPlace时,会直接返回Y。
容错优化方案(应对拼写错误、缩写场景)
如果需要适配手动录入的拼写误差、缩写场景,可以搭配SQL Server的语音匹配函数提升准确率:
- 用
SOUNDEX函数匹配发音相近的字符串,适合拼写错但读音接近的场景:
CASE WHEN CHARINDEX(TidyManualAddress, CorrectedAddress) > 0 OR SOUNDEX(TidyManualAddress) = SOUNDEX(CorrectedAddress) THEN 'Y' ELSE 'N' END AS AddressMatch
- 用
DIFFERENCE函数自定义相似度阈值(返回值为0-4,分值越高相似度越高,通常阈值设为3即可覆盖大部分拼写错误场景):
CASE WHEN CHARINDEX(TidyManualAddress, CorrectedAddress) > 0 OR DIFFERENCE(TidyManualAddress, CorrectedAddress) >= 3 THEN 'Y' ELSE 'N' END AS AddressMatch
额外优化建议
- 匹配前可以将两个地址字段统一转为大写或小写,避免大小写差异导致匹配失败,例如处理地址时加上
UPPER()函数:UPPER(REPLACE(CONCAT(AddressLine1,AddressLine2,AddressLine3,AddressLine4),' ','')) AS CorrectedAddress - 如果缩写场景较多,可以提前维护一张地址缩写映射表(比如
Rd对应Road、St对应Street),匹配前先将地址中的缩写替换为标准全称,可大幅提升匹配准确率。
内容的提问来源于stack exchange,提问作者Brian Dennehy
相关产品推荐
相关产品推荐

