2010-04-30 81 views
0

我有一個數據集,我每晚都導入SQL表。一個字段是'Address_3',包含城市,州,郵政編碼和國家/地區字段。但是,這些數據不是標準化的。如何最好地將當前進入1字段的數據解析爲單個字段。以下是我可能收到的一些數據示例:使用t-sql或SSIS解析地址字段的最佳方式是什麼?

'INDIANAPOLIS, IN 46268 US' 
'INDIANAPOLIS, IN 46268-1234 US' 
'INDIANAPOLIS, IN 46268-1234' 
'INDIANAPOLIS, IN 46268' 

在此先感謝! David

回答

2

我已經做了類似的事情(不是在T-SQL中),我發現它最適合從字符串的末尾開始並向後工作。

  • 抓住最右邊的元素直到第一個空格或逗號。
  • 這是一個已知的國家代碼嗎?這是一個國家
  • 如果不是,是不是所有的數字(包括連字符)?這是一個郵政編碼。
  • 否則丟棄

抓住右數第二元素到下一個空格或逗號

  • 它是一個兩種α-字符型字段?這是國家

抓住一切最後一個逗號前面,並調用它的城市。

你需要做基於你的輸入數據的模樣,但其基本思路是從右邊開始,抓住你可以很容易地進行分類的元素,並呼籲所有其他城市一些調整。

您可以通過使用REVERSE功能,使搜索更容易(在這種情況下,你會被解析字符串像我上面所說的由左到右,而不是從右到左),在PATINDEXCHARINDEX函數來實現這樣的事情找到空格和逗號,以及SUBSTRING函數根據PATINDEX和CHARINDEX找到的位置分開地址。您可以使用ASCII函數來確定一個字符是否爲數字。

你標註了SSIS標記你的問題,以及 - 這可能是更容易實現一些VB腳本解析SSIS中,而不是試圖用T-SQL來做到這一點。

0

在SSIS中,你可以有4個派生列(市,州,郵編,國家)。

substring(column,1,FINDSTRING(",",column,1)-1) --city 
substring(column,FINDSTRING(" ",column,1)+1,FINDSTRING("",column,2)-1) --state 
substring(column,FINDSTRING(" ",column,2)+1,FINDSTRING(" ",column,3)-1) -- zip 

您可以看到上面的模式並相應地繼續。這可能會有點複雜。您可以使用腳本組件來更好地提取文本行。

1

到目前爲止,最好的方法是不推倒重來,並得到一個地址解析和標準化引擎。理想情況下,您可以使用郵政局批准的經CASS認證的發動機。然而,現在網絡上有免費的地址解析器,其中的任何一個都比嘗試自己解析地址更準確,而且更少受挫。

這就是說,我會說,地址解析器和自下而上郵局工作(因此,國家,那麼郵政編碼,然後城市,那麼狀態,那麼第2行地址等)。

0

這樣的事情應該有所幫助:

select substring(CityStateZip, 1, 
case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) 
else len(CityStateZip) - charindex(',',reverse(CityStateZip)) end) as City, 
LEFT(LTRIM(
SUBSTRING(CityStateZip, case when charindex(',',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(',',reverse(CityStateZip))+2 end, LEN(CityStateZip))) 
,2) as State, 

SUBSTRING(CityStateZip, case when charindex(' ',reverse(CityStateZip)) = 0 then len(CityStateZip) else 
len(CityStateZip) - charindex(' ',reverse(CityStateZip))+2 end, LEN(CityStateZip)) as Zip 

from YourAddressTable 
相關問題