2010-01-19 33 views
4

我们有一列街道地址:在SQL Server中匹配街道地址的方法有哪些?

123 Maple Rd。
321 1st Ave.
等等

有没有办法向这些地址匹配给定的输入?输入将是一个街道地址,但它可能不是相同的格式。例如:

123枫路
321第一大街

我们首先想到的是去除所有街道术语(RD,ST,AVE,BLVD等)的输入端。

很明显,这不会一直可靠地匹配。有没有其他方法可以尝试匹配SQL Server中的街道地址?

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

+0

听起来像全职搜索的工作。什么版本的SQL Server? – 2010-01-19 21:45:23

+0

您可能想仔细阅读USPS的编址标准文件......可能会让您了解一些可能性。 http://pe.usps.gov/text/pub28/welcome.htm – Seth 2010-01-19 21:49:06

回答

2

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

+0

这是我们去的方式。在尝试(不成功)匹配地址后,我们终于说服人们最好不要走这条路。相反,我们正在使用某种类型的第三方软件来为我们标准化地址。 – dtc 2010-02-11 02:03:26

+0

@metanaito你跟谁一起去的?我为[SmartyStreets](http://www.smartystreets.com)工作,这是一家CASS认证的地址验证软件供应商。意思是说,如果您还有任何关于地址验证的问题,我会很乐意亲自为您解答。正如其他人所建议的那样,我会谨慎地自己做这件事。这实际上是一个很难的问题。 – Matt 2012-02-24 18:49:48

5

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

例如,替换'rd'或'rd'。与'路'和'st'或'st。'与'街道'比较之前。

+0

'st johns lane' - >'street johns lane' – Andrew 2016-02-17 19:37:14

+0

这就是为什么我走向相反的方向,并由长变短。所以圣约翰巷 - >圣约翰巷。当人们使用非标准缩写词时,最大的问题就是人们使用非标准缩写词,或者由于上游某处的最大字段长度而导致某个词被切碎(您将得到“Avenu”而不是“Avenue”)。没有银子弹。 – jep 2016-08-02 20:42:58

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街,连接到连接到South Owasso大道的North Owasso大道。但是,只有一个维多利亚大道。

鉴于这一现实,你必须拥有所有道路名称的数据库,并查找最接近的道路(和处理seperately数)

OR

做提前的时间决定你将坚持和你不会。

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距离实现:

注意:您将需要实现上述实施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 

您还可能有兴趣在检查出下面的文章:

+0

很棒的回答。 警告,但。 TSQL实施的链接被破坏。有时会在一个骗局页面中打开。 – cockypup 2016-03-18 17:06:46

2

剥离数据是一个坏主意。许多城镇会有几十种同一条街的变体 - 橡树街,橡树路,橡树巷,橡树圈,橡树园,橡树大道等......如上所述,转换为标准USPS缩写是一种更好的方法。