在SQL中匹配相似的城市名称

在SQL中匹配相似的城市名称,sql,sql-server,select,Sql,Sql Server,Select,我有一个表“City”,其中包含城市名称,还有一个表是我刚刚创建的,其中包含来自不同来源的城市。当我运行一个查询来匹配两个表之间的城市时,我发现大约5000个不匹配 所以请给出一些我可以用来匹配城市的查询(因为有时用户输入的城市名称有一个或两个不同的字符)。。。我已经创建了一个运行良好的查询,但我需要这样一个查询来匹配更多 请建议我在这种情况下该怎么办 SELECT distinct hsm.countryname,co.countryname,hsm.city,co.city FROM H

我有一个表“City”,其中包含城市名称,还有一个表是我刚刚创建的,其中包含来自不同来源的城市。当我运行一个查询来匹配两个表之间的城市时,我发现大约5000个不匹配

所以请给出一些我可以用来匹配城市的查询(因为有时用户输入的城市名称有一个或两个不同的字符)。。。我已经创建了一个运行良好的查询,但我需要这样一个查询来匹配更多

请建议我在这种情况下该怎么办

SELECT distinct hsm.countryname,co.countryname,hsm.city,co.city
FROM   HotelSourceMap AS hsm
INNER  JOIN 
    (  SELECT c.*,cu.countryName
       FROM   city c
       INNER  JOIN  country cu ON c.countryid= cu.countryId
    ) co
ON (charindex(co.city,hsm.city) > 0 AND hsm.countryid = co.countryid) AND
    hsm.cityid is null
如果将算法实现为用户定义的函数,它将返回需要在字符串_1上执行的操作数,使其成为字符串_2。然后,可以将Levenshtein距离函数的结果与固定阈值或字符串_1或字符串_2的百分比长度进行比较

您只需按如下方式使用它:

WHERE LD(city_1, city_2) < 4;
其中LD(城市1,城市2)<4;
使用可能是另一种选择,特别是因为Levenshtein距离的实现需要一个完整的表扫描。此决定可能取决于您打算进行此比较的频率

您可能需要检查SQL Server的以下Levenshtein距离实现:


您必须修复数据库中的名称。数据库是为了精确匹配,而不是“看起来很像”。最简单的修复方法可能是以CSV格式导出表,将其加载到Excel(两列:主键和城市名称),然后使用拼写检查器修复名称。修复所有名称后,再次导入表。

您可以使用比较两个拼写不同但发音相似的字符串

这取决于它们是如何错投的。如果只是打字错误,可能使用Daniel Vassallo推荐的Levenshtein距离。如果是不确定城市拼法的人拼错了,请使用Soundex


也许两者都用

最好的解决方案是使用SOUNDEX。我试过一些测试:它和Waterland、Witerland匹配,但和Wiperland不匹配。我认为这应该满足你的要求。SOUNDEX将alpha字符串转换为四个字符的代码,以查找发音相似的单词或名称

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Waterland')
==>匹配

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Witerland')
select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Wiperland')
==>匹配

select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Witerland')
select * from HotelSourceMap where SOUNDEX([city]) = SOUNDEX('Wiperland')

==>不匹配

SoundEx功能是此类场景的最佳选择,但仅在单词中的元音不正确或不存在时才起作用。如果辅音不匹配,它将不起作用。
另一种方法是编写一个简单的逻辑来定义两个单词之间适当的不匹配限制;虽然不会给出100%的准确度,但可以解决这个问题。一个简单的标量值函数,在内部使用SoundeEx函数就足够了。

我很幸运地使用了双变音算法来对名称进行模糊匹配。这个概念与Soundex相似,因为它将一个单词归结为一个代码,但它要复杂得多。在我的数据库中,我将有一个“name”字段和一个“namedubleMetaphone”字段,我在插入时计算它们。这使得搜索和连接非常快速


Wikipedia是一个很好的起点:

hi hubens很高兴在这么多天之后见到你。我已经创建了函数Levenshtein,正如你所说,但当我使用它时,它给我的错误是找不到列“dbo”或用户定义的函数或聚合“dbo.MIN3”,或者名称不明确。我是这样使用它的(正如你所说)选择hsm。*从HotelSourceMap hsm,city c那里dbo.LEVENSHTEIN(hsm.city,c.city)<4是的,我忘了提到这一点。您需要定义MIN3函数。使用以下小脚本:。叫它MIN3而不是fnMin3。现在告诉我该叫哪个fnMin3或Levenshtein。。请解释清楚如果我尝试<4….它不匹配。。。。。所以现在我想知道要花多少时间才能完成?soundex对单个单词很有效,但对多个单词的名称却不起作用,比如select soundex(“纽约”)、soundex(“新德里”)@Mongus:谢谢,真的对我很有帮助。