在一个表中,我有一个完整的地址,我必须将其拆分为城市和邮政编码,以存储在其他列中。
以下是示例地址:
address= 'Marco Polo street 8a, 44000 Vienna'
有些行可能包含多个地址,但我必须只保留最后一个逗号(44000 Vienna
(后的最后一部分。
所以最终的结果应该是:
post_office = 44000
city = Vienna
迄今为止已尝试:https://stackoverflow.com/a/13430958/2119941
带有嵌套子字符串,如下所示:
city = SUBSTRING(SUBSTRING(address, CHARINDEX(' ', address, 0) + 1, LEN(address)), CHARINDEX(',', address, 0) + 1, LEN(address))
和
post_office = SUBSTRING(SUBSTRING(address, CHARINDEX(',', address, 0) + 1, LEN(address)), 0, CHARINDEX(' ', address, 0))
但这只是部分有效,因为城市也可以有多个单词,比如:
city = '44300 Vienna Old Town'
我的数据规则是:找到最后一个逗号,取逗号后的所有数字,并将其定义为post_office
,然后,在post_office
后的第一个空格后,直到字符串的其余部分,它应该被定义为城市。
我正在运行Microsoft SQL Server 2017(v14.0.3391.2-X64(
好吧,我想你的问题下面的评论已经详细说明了为什么数据的存储方式是个坏主意,以及如果你对地址的假设不是100%准确,你的尝试可能会以什么方式失败。
话虽如此,你可能正在尝试补救,如果你确信你定义的规则总是符合的,你可以做你想做的事。
要实现这一点,请使用REVERSE()
函数两次来查找子字符串的最后一次出现。通过这种方式,您可以从最后一个逗号开始分隔所有内容。在上面使用TRIM()
函数可以删除可能出现的周围空白,例如,如果逗号后面有空格。
如果您确定邮政编码中只有数字字符和空格,并且邮政编码紧随其后,则可以将PATINDEX
与LEFT()
和RIGHT()
一起使用来查找第一个非数字字符,类似于此SO帖子。
完整解决方案:针对输入数据
地址 |
---|
维也纳44000马可波罗大街8a号 |
马可波罗街8a,44000维也纳老城 |
马可波罗大街8a号,44000维也纳 |
马可波罗街8a,马可波罗街8b,44000维也纳老城 |
马可波罗街8a,44 00 0维也纳 |
address= 'Marco Polo street 8a, 44000 Vienna' ; Var
newadd=Split.address(,); Var pincode =split.newadd( ); pincode[0]// is pincode 44000 pincode[1]// vienna