我有一个使用SQL DIFFERENCE函数的函数来查看客户端的名称是否与数据库中已有的客户端类似
SELECT ID FROM People p
WHERE DIFFERENCE(p.FullName, @fullName) = 4
将@fullname作为传递给函数的变量。我遇到的问题是,如果我将“pedro sanchez”作为参数传递,查询将把我所有的Peter都带到数据库中,或者如果我输入“pablo sanchez”,它将带来记录“PEOPLE'S CREDIT UNION”
据我所知,当两个字符串几乎相同时,DIFFERENCE函数应该返回4,但结果我已经说过了。
有没有办法进一步指定与DIFFERENCE函数的相似性,或者找到类似名称的另一种方法?
答案 0 :(得分:3)
评论太长了。
Difference()
基于soundex()
,而后者 - 坦率地说 - 是一个用于比较字符串的糟糕系统。让我添加一个警告:它非常适合它的设计目的,它匹配英语人的姓氏。您可以阅读有关规则here的内容,然后您可以试用here。使用后一个链接,您可以看到“Pedro”和“People”具有相同的代码,P-140。
Soundex对辅音进行编码,基本上是它关注的列表中的前四个匹配辅音。 (有些语言,例如夏威夷语和其他波利尼西亚语言在辅音中相当轻松。有人认为设计师不会考虑这些语言中的名字。)
当您在书写字符串中寻找接近度时,Levenshtein distance是一种常见指标。遗憾的是,SQL Server内置了此功能,但您可以轻松地在Web上查找实现。对于大多数实际应用,Levenshtein距离太慢。令人高兴的是,全文搜索组件的功能通常足以满足大多数用途。