SQL DIFFERENCE函数,名称带来太多结果

时间:2015-05-28 17:10:39

标签: sql sql-server database difference

我有一个使用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函数的相似性,或者找到类似名称的另一种方法?

1 个答案:

答案 0 :(得分:3)

评论太长了。

Difference()基于soundex(),而后者 - 坦率地说 - 是一个用于比较字符串的糟糕系统。让我添加一个警告:它非常适合它的设计目的,它匹配英语人的姓氏。您可以阅读有关规则here的内容,然后您可以试用here。使用后一个链接,您可以看到“Pedro”和“People”具有相同的代码,P-140。

Soundex对辅音进行编码,基本上是它关注的列表中的前四个匹配辅音。 (有些语言,例如夏威夷语和其他波利尼西亚语言在辅音中相当轻松。有人认为设计师不会考虑这些语言中的名字。)

当您在书写字符串中寻找接近度时,Levenshtein distance是一种常见指标。遗憾的是,SQL Server内置了此功能,但您可以轻松地在Web上查找实现。对于大多数实际应用,Levenshtein距离太慢。令人高兴的是,全文搜索组件的功能通常足以满足大多数用途。