【发布时间】:2018-08-03 00:14:57
【问题描述】:
我试图在空格分隔符上拆分 SQL 中的字符串。空格数会发生变化,因此可以有 4 或 5 列的值。我正在尝试使用CHARINDEX 和SUBSTRING,但无法通过第一个分隔符。
示例:
输入将是'444 Addison Avenue SA 5222'
【问题讨论】:
标签: sql sql-server tsql split sql-server-2016
我试图在空格分隔符上拆分 SQL 中的字符串。空格数会发生变化,因此可以有 4 或 5 列的值。我正在尝试使用CHARINDEX 和SUBSTRING,但无法通过第一个分隔符。
示例:
输入将是'444 Addison Avenue SA 5222'
【问题讨论】:
标签: sql sql-server tsql split sql-server-2016
要拆分成列,您可以使用一些 XML 与 CROSS APPLY 配合使用
示例
Declare @YourTable Table ([SomeCol] varchar(50))
Insert Into @YourTable Values
('444 Addison Avenue SA 5222')
,('1 Washington Square')
Select A.*
,B.*
From @YourTable A
Cross Apply (
Select Pos1 = ltrim(rtrim(xDim.value('/x[1]','varchar(max)')))
,Pos2 = ltrim(rtrim(xDim.value('/x[2]','varchar(max)')))
,Pos3 = ltrim(rtrim(xDim.value('/x[3]','varchar(max)')))
,Pos4 = ltrim(rtrim(xDim.value('/x[4]','varchar(max)')))
,Pos5 = ltrim(rtrim(xDim.value('/x[5]','varchar(max)')))
,Pos6 = ltrim(rtrim(xDim.value('/x[6]','varchar(max)')))
From (Select Cast('<x>' + replace((Select replace([SomeCol],' ','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml) as xDim) as A
) B
退货
【讨论】:
§§Split§§是什么吗?
只有基于XML的分割才能达到同样的效果:
DECLARE @tmp TABLE ([Address] varchar(50))
INSERT INTO @tmp VALUES ('444 Addison Avenue SA 5222'),('1 Washington Square')
SELECT T.[Address]
,AddressElements.value(N'/x[1]','varchar(max)') AS Element_1
,AddressElements.value(N'/x[2]','varchar(max)') AS Element_2
,AddressElements.value(N'/x[3]','varchar(max)') AS Element_3
,AddressElements.value(N'/x[4]','varchar(max)') AS Element_4
,AddressElements.value(N'/x[5]','varchar(max)') AS Element_5
FROM (
SELECT [Address]
,CAST('<x>' + REPLACE([Address],' ','</x><x>') + '</x>' AS XML) AS AddressElements
FROM @tmp
) T
结果:
【讨论】: