SQL Server 2019中DIFFERENCE函数返回结果存疑,求解析
解释SQL Server 2019中DIFFERENCE函数的反常结果
你遇到的DIFFERENCE函数结果看似反常,核心原因在于它依赖的SOUNDEX编码有两个关键特性:
- 只认字符串开头的发音:SOUNDEX编码的核心是字符串最前面的几个辅音发音,后续字符只会填充编码的后几位,不会改变开头的核心特征。
- 完全忽略空格:SOUNDEX会把空格当成不存在,直接处理整个字符串,但首字母永远是整个字符串的第一个字母(不管后面有没有空格)。
逐个分析你的测试案例
1. DIFFERENCE('Good', 'Good Samaritans') → 4分
Good的SOUNDEX编码是G300(首字母G,取辅音d的编码3,后面没有有效辅音补0)。Good Samaritans的SOUNDEX编码是G325(首字母G,取d的编码3,再取空格后S的编码2、m的编码5)。- DIFFERENCE对比这两个编码时,前两位(G、3)完全匹配,后两位的差异对总分影响极小,最终拿到最高分4。
2. DIFFERENCE('Samaritans', 'Good Samaritans') →1分
Samaritans的SOUNDEX编码首字母是S,但Good Samaritans的SOUNDEX编码首字母是G(因为它是整个字符串的第一个字母,空格被忽略)。- SOUNDEX的首字母是编码的核心,首字母不同直接丢分,加上后续编码的每一位几乎都不匹配,最终得分只有1。
3. DIFFERENCE('Sam', 'Good Samaritans') →2分
Sam的SOUNDEX编码是S500(首字母S,取辅音m的编码5)。Good Samaritans的SOUNDEX编码是G325,虽然首字母G和S不同,但Sam的第二位编码5,和Good Samaritans的第四位编码5匹配,DIFFERENCE的评分逻辑会把这种后位匹配算入得分,最终比第二个查询多拿1分。
总结
DIFFERENCE的结果不是基于整个字符串的相似度,而是基于SOUNDEX编码的前缀特征匹配。只要开头的发音特征匹配度高,哪怕后面内容差很多也能拿高分;反之,开头发音不同,哪怕后面内容完全一致,得分也会极低。
内容的提问来源于stack exchange,提问作者Scho
相关产品推荐
相关产品推荐

