2010-04-30 36 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 
相关问题