我有一个数据集,我每晚都会导入到 SQL 表中。一个字段是“Address_3”,包含城市、州、邮编和国家字段。但是,这些数据不是标准化的。如何最好地将当前进入 1 个字段的数据解析为单个字段。以下是我可能收到的一些数据示例:
'INDIANAPOLIS, IN 46268 US'
'INDIANAPOLIS, IN 46268-1234 US'
'INDIANAPOLIS, IN 46268-1234'
'INDIANAPOLIS, IN 46268'
提前致谢!大卫
我有一个数据集,我每晚都会导入到 SQL 表中。一个字段是“Address_3”,包含城市、州、邮编和国家字段。但是,这些数据不是标准化的。如何最好地将当前进入 1 个字段的数据解析为单个字段。以下是我可能收到的一些数据示例:
'INDIANAPOLIS, IN 46268 US'
'INDIANAPOLIS, IN 46268-1234 US'
'INDIANAPOLIS, IN 46268-1234'
'INDIANAPOLIS, IN 46268'
提前致谢!大卫
我做过类似的事情(不是在 T-SQL 中),我发现最好从字符串的末尾开始并向后工作。
抓住第二个最右边的元素直到下一个空格或逗号
抓住最后一个逗号之前的所有其他内容并将其称为城市。
您需要根据输入数据的外观进行一些调整,但基本思想是从右侧开始,抓住您可以轻松分类的元素并将其他所有内容称为城市。
您可以通过使用REVERSE函数来实现类似的功能,以使搜索更容易(在这种情况下,您将从左到右解析字符串,而不是像我上面所说的那样从右到左解析字符串),使用PATINDEX或CHARINDEX函数来查找空格和逗号和SUBSTRING函数根据 PATINDEX 和 CHARINDEX 找到的位置将地址分开。您可以使用ASCII函数来确定字符是否为数字。
您也使用 SSIS 标记标记了您的问题 - 在 SSIS 中的某些 VB 脚本中实现解析可能比尝试使用 T-SQL 更容易。
到目前为止,最好的方法是不要重新发明轮子并获得地址解析和标准化引擎。理想情况下,您将使用经过邮政服务批准的 CASS 认证引擎。但是,如今网络上有免费的地址解析器,其中任何一个都比尝试自己解析地址更准确,更不令人沮丧。
也就是说,我会说地址解析器和邮局自下而上工作(因此,国家,然后是邮政编码,然后是城市,然后是州,然后是地址第 2 行等)。
在 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
您可以看到上面的模式并相应地继续。这可能会有点复杂。您可以使用脚本组件来更好地提取文本行。
这样的事情应该有帮助:
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