2010-01-19 34 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縮寫是一種更好的方法。