我有一个地址字符串,我试图分成3个不同的列:houseNumber,streetName,streetTag。原始字段地址中包含未知数量的字符,因为houseNumber可以是2位数或5位数。
以下是源数据:
rowNum: 2
address: 6008 Spruce Rd
以下是我的尝试:
update [originDB].dbo.[originTable]
set houseNumber = (select substring(address, 1, CHARINDEX(' ', address) -1)
AS houseNumber
from [originDB].dbo.[originTable] where rowNum = 2)
--select * from [originDB].dbo.[originTable]
where rowNum = 2
它更正了拆分houseNumber,但是我不太确定如何再次在空间拆分以获得streetName和streetTag。我不能写自己的功能(政策限制。)
我最初的想法是从一个方向分割(因为streetTag将始终是字符串中的最后一个单词),从另一个方向分割(对于houseNumber),然后使用留下的任何东西作为streetName,理解可能会有一些手动清理。
有什么建议吗?谢谢!
答案 0 :(得分:0)
使用找到的代码here:
REVERSE(SUBSTRING(REVERSE([field]),0,CHARINDEX('[char]',REVERSE([field]))))
我们可以在[field]中找到[char]的最后一次出现。 (地址空间)
6008 新墨西哥州 St
^1st Space ^Last space
6008
New Mexico
St
这个从地址长度的位置到最后一个空格的地址的子字符串
streetName = (select substring(address, len(houseNumber)+1, REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(' ',REVERSE(address)))))
这个从最后一个空格出现的地址的子字符串到地址的长度(地址的结尾)。
streetTag = (select substring(address, REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(' ',REVERSE(address)))), len(address))
update [originDB].dbo.[originTable]
set houseNumber = (select substring(address, 1, CHARINDEX(' ', address) -1)
AS houseNumber,
streetName = (select substring(address, len(houseNumber)+1, REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(' ',REVERSE(address))))) AS streetName,
streetTag = (select substring(address, REVERSE(SUBSTRING(REVERSE(address),0,CHARINDEX(' ',REVERSE(address)))), len(address)) AS streetTag
from [originDB].dbo.[originTable] where rowNum = 2)
--select * from [originDB].dbo.[originTable]
where rowNum = 2