在SQL Server中匹配街道地址的方法有哪些?

zazmityj  于 2023-02-11  发布在  SQL Server
关注(0)|答案(9)|浏览(303)

我们有一个街道地址栏:
枫树路123号
第一大道321号
等等。
有没有办法将这些地址与给定的输入进行匹配?输入可能是街道地址,但格式可能不同。例如:
枫树路123号
第一大道321号
我们首先想到的是去除所有街道术语(rd、st、ave、blvd等)的输入。
显然,这并不总是可靠地匹配。还有其他方法可以尝试在SQL Server中匹配街道地址吗?
我们可以使用用户定义函数,存储过程和常规的旧t-sql。我们不能使用clr。

huwehgph

huwehgph1#

不要把那些可变的东西剥离出来,而是试着把它们转换成一种可以比较的“规范形式”。
例如,在进行比较之前,将“rd”或“rd.”替换为“road”,将“st”或“st.”替换为“street”。

wbgh16ku

wbgh16ku2#

您可能需要考虑使用Levenshtein Distance算法。
您可以在SQL Server中将其创建为用户定义函数,在该函数中,它将返回需要对String_A执行的操作数,以使其变为String_B。然后,您可以将Levenshtein Distance函数的结果与某个固定阈值或从字符串长度派生的某个值进行比较。
您只需按如下方式使用它:

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

正如Mark Byers所建议的,如果使用Levenshtein Distance,将变量项转换为规范形式会有所帮助。
使用全文搜索可能是另一种选择,特别是因为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

您可能还对以下文章感兴趣:

eufgjt7s

eufgjt7s3#

为了进行正确的街道地址匹配,您需要将地址转换为标准格式。请查看USPS邮政标准here(我假设你正在处理美国的地址)。这绝不是一个简单的过程,如果你想能够处理所有类型的美国邮件地址。QAS和Satori Software等公司提供的软件可以为您进行标准化。您需要导出您的地址,运行他们通过软件,然后加载数据库与更新的地址。也有第三方供应商,将执行地址标准化以及。这可能是矫枉过正,你正在尝试做的,但它是最好的方式做到这一点。如果数据库中的地址是标准化的,那么您将有更好的机会匹配它们(特别是如果您也可以标准化输入)。

ui7jx7zq

ui7jx7zq4#

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

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

在同一个地区有枫树街和枫树大道吗?橡树街对橡树大道怎么样?
例如,我住的地方有很多街道/道路/大道/大道都叫奥瓦索。我住在奥瓦索街,它连接到北奥瓦索大道,它连接到南奥瓦索大道。然而,只有一条维多利亚大道。
考虑到这一现实,你必须要么有一个数据库的所有道路名称,并寻找最近的道路(并处理号码分开)

提前决定你会坚持什么,不会坚持什么。

fruv7luv

fruv7luv5#

地址匹配和重复数据删除是一件麻烦的事情。其他的海报说地址需要首先标准化到当地的邮政标准机构(例如如果是美国地址,美国邮政)是正确的。一旦地址是标准格式,剩下的就很容易了。
有几个第三方服务可以标记列表中的重复项。仅使用MySQL子查询无法解决地址格式和标准的差异。USPS(用于美国地址)有一定的指导原则来制定这些标准,但只有少数供应商获得认证可以执行此类操作。
所以,我建议你最好的解决办法是将表格导出为CSV文件,然后提交给一个强大的列表处理器。SmartyStreets的Bulk Address Validation Tool就是这样一个例子,它会在几秒钟到几分钟内自动完成。它会用一个名为"Duplicate"的新字段标记重复的行,并在其中输入Y值。
尝试标准化和验证几个地址here,以了解输出的外观。
完全披露:我为SmartyStreets工作

dwthyt8l

dwthyt8l6#

剥离数据是一个坏主意。许多城镇会有几十个相同街道的变体-橡树街,橡树路,橡树巷,橡树圈,橡树苑,橡树大道等...如上所述,转换为规范的美国邮政缩写是一个更好的方法。

相关问题