当字符数未知时在SQL中拆分

时间:2015-06-30 01:57:08

标签: sql sql-server substring

我有一个地址字符串,我试图分成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,理解可能会有一些手动清理。

有什么建议吗?谢谢!

1 个答案:

答案 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