我需要在包含许多条的行中获取某个单词。举个例子:
WORD1/WORD2/WORD3/WORD4/WORD5
我需要专门获取WORD 3
和/或WORD 4
。
我尝试使用 CHARINDEX
和 SUBSTRING
但无法为此编写可靠的代码。
(我正在使用 Microsoft SQL Server)
谢谢
最佳答案
如果您的位置数量已知或最大,这里有一个使用少量 XML 的说明。
注意:如果您的字符串位于表中,则很容易嵌套在 CROSS APPLY 中甚至作为 TVF。
示例
Declare @S varchar(max) = 'WORD1/WORD2/WORD3/WORD4/WORD5'
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
,Pos6 = xDim.value('/x[6]','varchar(max)')
,Pos7 = xDim.value('/x[7]','varchar(max)')
,Pos8 = xDim.value('/x[8]','varchar(max)')
,Pos9 = xDim.value('/x[9]','varchar(max)')
From ( values (cast('<x>' + replace((Select replace(@S,'/','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml))) as A(xDim)
返回
Pos1 Pos2 Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9
WORD1 WORD2 WORD3 WORD4 WORD5 NULL NULL NULL NULL
编辑 - 如果您的数据在表中
Declare @YourTable table (id int,SomeCol varchar(max))
Insert Into @YourTable values
(1,'WORD1/WORD2/WORD3/WORD4/WORD5')
Select A.ID
,B.*
From @YourTable A
Cross Apply (
Select Pos1 = xDim.value('/x[1]','varchar(max)')
,Pos2 = xDim.value('/x[2]','varchar(max)')
,Pos3 = xDim.value('/x[3]','varchar(max)')
,Pos4 = xDim.value('/x[4]','varchar(max)')
,Pos5 = xDim.value('/x[5]','varchar(max)')
,Pos6 = xDim.value('/x[6]','varchar(max)')
,Pos7 = xDim.value('/x[7]','varchar(max)')
,Pos8 = xDim.value('/x[8]','varchar(max)')
,Pos9 = xDim.value('/x[9]','varchar(max)')
From ( values (cast('<x>' + replace((Select replace(SomeCol,'/','§§Split§§') as [*] For XML Path('')),'§§Split§§','</x><x>')+'</x>' as xml))) as X(xDim)
) B
返回
ID Pos1 Pos2 Pos3 Pos4 Pos5 Pos6 Pos7 Pos8 Pos9
1 WORD1 WORD2 WORD3 WORD4 WORD5 NULL NULL NULL NULL
关于SQL Server - 在许多/之间获取一个单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60544962/