我有一个函数,它使用 SQL DIFFERENCE 函数来查看客户端的名称是否与数据库中已有的客户端相似
SELECT ID FROM People p
WHERE DIFFERENCE(p.FullName, @fullName) = 4
被@fullname传递给函数的变量。我遇到的问题是,如果我传递"佩德罗·桑切斯"作为参数,查询将把我所有的彼得都带到数据库中,或者如果我输入"巴勃罗·桑切斯",它会带来记录"人民信用社"。
据我了解,当两个字符串几乎相同时,DIFFERENCE 函数应该返回 4,但我得到的结果并非如此。
有没有办法进一步指定与 DIFFERENCE 函数的相似之处,或者可能是另一种查找相似名称的方法?
Difference()
是基于soundex()
的,坦率地说,这反过来又是一个用于比较字符串的糟糕系统。让我补充一个警告:它的设计目的非常好,即匹配英语人的姓氏。您可以在此处阅读有关规则的信息,也可以在此处尝试。使用后一个链接,您可以看到"佩德罗"和"人"具有相同的代码 P-140。
Soundex对辅音进行编码,基本上前四个匹配的辅音是它关心的列表。(有些语言,如夏威夷语和其他波利尼西亚语言,辅音相当轻。人们假设设计师没有考虑这些语言的名称。
当您寻找写入字符串之间的邻近度时,Levenshtein 距离是一个常见的指标。遗憾的是,SQL Server 没有内置此功能,但您可以在 Web 上轻松找到实现。对于大多数实际应用,Levenshtein距离太慢。令人高兴的是,全文搜索组件的功能通常足以满足大多数目的。