我希望能够将以下内容拆分为单独的地址行。我在使用mssql的列中有多行

我希望能够将以下内容拆分为单独的地址行。我在使用mssql的列中有多行,sql,sql-server,tsql,substring,Sql,Sql Server,Tsql,Substring,我的数据源如下所示 John Doe| 26 CHANCE ROAD SUTTON SURREY | 26 CHANCE ROAD | SUTTON | SURREY| 在第二列中,每个地址行用字符(10)+字符(13)分隔 我希望我的输出像这样 John Doe| 26 CHANCE ROAD SUTTON SURREY | 26 CHANCE ROAD | SUTTON | SURREY| 我一直在使用子字符串,但我只能使用 SUBSTRING(dbo.Address, 0, CHA

我的数据源如下所示

John Doe| 26 CHANCE ROAD SUTTON SURREY |
26 CHANCE ROAD | SUTTON | SURREY|
在第二列中,每个地址行用字符(10)+字符(13)分隔

我希望我的输出像这样

John Doe| 26 CHANCE ROAD SUTTON SURREY |
26 CHANCE ROAD | SUTTON | SURREY|
我一直在使用子字符串,但我只能使用

SUBSTRING(dbo.Address, 0, CHARINDEX(CHAR(13) + CHAR(10), dbo.Address + CHAR(13) + CHAR(10))) as ADDRESS_1,

如果SQL版本>=2016且数据库兼容性级别至少设置为130,我将使用MSSQL 您可以使用字符串分割(字符串、分隔符)函数 更多信息请点击此处:

对于另一个SQL server/兼容版本,您需要编写自己的函数,我打赌您也可以在StackOverflow上找到许多类似的函数。 就像这里: 还是在这里 或者在这里。。。


并且列表可以继续。

如果您使用的是SQL Server 2016或更高版本,并且您的数据库设置为至少130的兼容级别,则字符串分割是一个不错的选择。但是,字符串分割的分隔符只能是单个字符。在本例中,您有两个字符作为分隔符。在您的示例中,您几乎已经获得了地址的第一部分。您可以通过以下方式获得其余内容:

SUBSTRING(Address, 1, CHARINDEX(CHAR(13) + CHAR(10), Address)) as ADDRESS_1,
SUBSTRING(Address, CHARINDEX(CHAR(13) + CHAR(10), Address), CHARINDEX(CHAR(13) + CHAR(10), Address,CHARINDEX(CHAR(13) + CHAR(10), Address)+1)-CHARINDEX(CHAR(13) + CHAR(10), Address)) as ADDRESS_2,
REVERSE(SUBSTRING(REVERSE(Address), 1, CHARINDEX(CHAR(10) + CHAR(13), REVERSE(Address)))) as ADDRESS_3
SUBSTRING()接受3个参数:表达式、开始、长度。编号以1为基础,而不是以0为基础。 CHARINDEX接受3个参数:expressionToFind、expressionToSearch和可选的start\u location

因此,要获得地址的第二部分,只需在第一个charindex处启动子字符串。长度是下一个分隔符的charindex-第一个分隔符的charindex


第三部分更简单:只需反转字符串和分隔符的顺序即可获得子字符串,然后只反转该子字符串。

无需使用string\u SPLIT,只保留子字符串和CHARINDEX(很多),并假设您的地址数据已足够规范化(例如[address]的所有值)将有四个“”实例,并且不会有公寓号或名称中带有空格的街道的情况),以下代码应将这些地址分成三列:街道、城市和县

create table #temp (client nvarchar(30),address nvarchar(50))
insert into #temp values ('John Doe', '26 CHANCE ROAD SUTTON SURREY')

select SUBSTRING(address,1,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address)+1)+1)) as [Street] 
        --starts at beginning, length goes to 3rd instance of ' '
    ,SUBSTRING(address,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address)+1)+1)
        ,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address)+1)+1)+1)-CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address)+1)+1)) as [City] 
        --starts at 3rd instance of ' ', length is distance from 3rd instance of ' ' to 4th instance
    ,SUBSTRING(address,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address,CHARINDEX(' ',address)+1)+1)+1),20) as [County] 
        --starts at 4th instance of ' ', length just needs to go through to the end
from #temp

字符串分割的分隔符只能是单个字符。在这种情况下,尝试在CHAR(13)+CHAR(10)上拆分将生成一个错误:过程需要类型为“nchar(1)/nvarchar(1)”的参数“separator”。谢谢,如果您有超过1个拆分字符,则SQL server 2006将一直保留到明年,您始终可以预先使用Replace函数将分隔符替换为一些未使用的文本字符,如instead CHAR(13)+CHAR(10)将其仅替换为CHAR(10),或替换为一些管道或其他字符。您只需替换双字符分隔符即可使用字符串分割:
STRING_分割(Replace(地址,CHAR(13)+CHAR(10),CHAR(13)),CHAR(13))
谢谢,我在运行查询时似乎遇到了这个错误,令人烦恼的是,我一直使用SQL server 2006,直到明年。Msg 537,级别16,状态5,第1行传递给LEFT或SUBSTRING函数的长度参数无效。完成时间:2019-12-04T10:25:12.4339820+00:00地址的格式是否始终相同:[门牌号][街道名称][街道类型][城市][县]?