在SQL中匹配相似的城市名称
我有一个表“City”,其中包含城市名称,还有一个表是我刚刚创建的,其中包含来自不同来源的城市。当我运行一个查询来匹配两个表之间的城市时,我发现大约5000个不匹配 所以请给出一些我可以用来匹配城市的查询(因为有时用户输入的城市名称有一个或两个不同的字符)。。。我已经创建了一个运行良好的查询,但我需要这样一个查询来匹配更多 请建议我在这种情况下该怎么办在SQL中匹配相似的城市名称,sql,sql-server,select,Sql,Sql Server,Select,我有一个表“City”,其中包含城市名称,还有一个表是我刚刚创建的,其中包含来自不同来源的城市。当我运行一个查询来匹配两个表之间的城市时,我发现大约5000个不匹配 所以请给出一些我可以用来匹配城市的查询(因为有时用户输入的城市名称有一个或两个不同的字符)。。。我已经创建了一个运行良好的查询,但我需要这样一个查询来匹配更多 请建议我在这种情况下该怎么办 SELECT distinct hsm.countryname,co.countryname,hsm.city,co.city FROM H
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距离实现:
也许两者都用 最好的解决方案是使用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:谢谢,真的对我很有帮助。