SQL Server中匹配街道地址的方法是什么?

问题描述 投票:4回答:8

我们有一列用于街道地址:

[123 Maple Rd。第一大街321号等等...

是否有任何方法可以将这些地址与给定输入匹配?输入的内容为街道地址,但格式可能不同。例如:

枫树道123号第一大街321号

我们首先想到的是剥离所有街道术语(rd,st,ave,blvd等)的输入。

显然,一直以来都不可靠。还有其他方法可以尝试在SQL Server中匹配街道地址吗?

我们可以使用用户定义的函数,存储的proc和常规的旧t-sql。我们不能使用clr。

sql sql-server street-address
8个回答
2
投票

为了进行正确的街道地址匹配,您需要将地址转换为标准格式。看一下USPS的邮政标准here(我假设您正在处理美国地址)。如果您希望能够处理所有类型的美国邮件地址,这绝非易事。您可以使用QAS和Satori Software等公司提供的软件来进行标准化。您需要导出地址,通过软件运行它们,然后使用更新的地址加载数据库。也有第三方供应商也将执行地址标准化。这可能对您尝试做的事有些过分,但这是最好的方法。如果数据库中的地址是标准化的,则将有更好的机会匹配它们(特别是如果您也可以标准化输入)。


5
投票

而不是剥离可变的东西,而是尝试将它们转换为可以比较的“规范形式”。

例如,替换为“ rd”或“ rd”。与“道路”和“圣”或“圣”。在比较之前将其与“街道”。


5
投票

您可能要考虑使用Levenshtein Distance算法。

您可以在SQL Server中将其创建为用户定义的函数,在该函数中它将返回需要在String_A上执行的操作数,以便它成为String_B。然后,您可以将Levenshtein距离函数的结果与某个固定阈值或与从字符串长度得出的某个值进行比较。

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

... WHERE LEVENSHTEIN(address_in_db, address_to_search) < 5;

作为Mark Byers suggested,如果您使用Levenshtein距离,则将变量项转换为规范形式会有所帮助。

使用Full-Text Search可能是另一种选择,尤其是因为Levenshtein通常需要全表扫描。该决定可能取决于您打算执行这些查询的频率。

您可能想查看以下用于SQL Server的Levenshtein Distance实现:

注意:您需要为上述实现实现MIN3函数。您可以使用以下内容:

CREATE FUNCTION MIN3(@a int, @b int,  @c int)
RETURNS int
AS
BEGIN
    DECLARE @m INT
    SET @m = @a

    IF @b < @m SET @m = @b
    IF @c < @m SET @m = @c

    RETURN @m
END

您可能也有兴趣查看以下文章:


3
投票

我认为您的第一步是更好地定义您对不同地址的慷慨程度。例如,哪些匹配,哪些不匹配:

123 Maple Street
123 Maple St
123 maple street
123 mpale street
123 maple
123. maple st
123 N maple street
123 maple ave
123 maple blvd

在同一地区既有枫树街又有枫树大道吗?橡树街和橡树大道怎么样?

例如,我居住的许多街道/道路/大道/大街都被命名为Owasso。我住在Owasso街,该街与北Owasso大道相连,北与Owasso大道相连。但是,只有一条维多利亚大街。

鉴于现实,您必须拥有所有道路名称的数据库,并寻找最近的道路(并单独处理数字)

OR

提前做出决定,坚持什么,不坚持什么。


2
投票

剥离数据是个坏主意。许多城镇在同一条街道上会有数十种变化形式-橡树街,橡树路,橡树巷,橡树园,橡树阁,橡树大道等。如上所述,转换为规范的USPS缩写是一种更好的方法。



1
投票

您可以尝试SOUNDEX看看是否能使您接近。 http://msdn.microsoft.com/en-us/library/aa259235%28SQL.80%29.aspx


0
投票

地址匹配和重复数据删除是一团糟。其他张贴者说正确的地址时,首先要向当地邮政标准局(例如,如果是美国地址,则为USPS)标准化,这是正确的。一旦地址采用标准格式,其余的操作就很容易。

© www.soinside.com 2019 - 2024. All rights reserved.