有人问过这个问题,但我还没有得到我需要的解决方案。
我想要拆分的字符串如下所示:
/Dev/act/billing
或
/ST/recManage/prod/form
我遇到的问题是第一个' /'当我尝试用LEFT / RIGHT / SUBSTRING / CHARINDEX做事时给我带来问题。它弄乱了计数并停在了分隔符处。此外,重要的是要注意分隔符的数量会发生变化。所以我想找到一种方法来拆分它,这样我就可以获得所有可能的子串。
RIGHT(c3.Path,CHARINDEX('/', REVERSE(c3.Path))-1) AS LastPath
这让我成了字符串的最后一部分。我和其他事情搞混了:
SUBSTRING(c3.Path,CHARINDEX('/',c3.Path,(CHARINDEX('/',c3.Path)+1))+1,len(c3.Path)),
这可以在第二个' /'
之后获得所有内容我也搞乱了XML和
SET @delimiter='/'
;WITH CTE AS
(SELECT CAST('<M>' + REPLACE([Path], @delimiter , '</M><M>') + '</M>' AS XML)
AS [Type XML]
FROM [Rpts].[dbo].[Cata]
)
,
CTE2 as (Select [Type XML].value('/M[2]', 'varchar(50)') As FirstPath from CTE)
然后执行:CTE2.FirstPath获取结果。但是这会给出NULL
我不在SQL 2016上,所以我不能使用SPLIT_STRING。
谢谢
答案 0 :(得分:3)
试试这个:
DECLARE @mockup TABLE(ID INT IDENTITY,YourString VARCHAR(MAX));
INSERT INTO @mockup VALUES('/Dev/act/billing'),('/ST/recManage/prod/form');
SELECT m.ID
,B.part.value(N'text()[1]',N'nvarchar(max)')
FROM @mockup AS m
OUTER APPLY(SELECT CAST('<x>' + REPLACE(m.YourString,'/','</x><x>') + '</x>' AS XML)) AS A(Casted)
OUTER APPLY A.Casted.nodes(N'/x[text()]') AS B(part);
只要您的字符串中没有禁用字符(即<
,>
和&
),此方法就会保存。如果你需要这个,只需打电话,就可以解决。
将.nodes()
与XQuery
谓词[text()]
一起使用会省略所有没有值的行...
结果
ID Part
---------
1 Dev
1 act
1 billing
2 ST
2 recManage
2 prod
2 form
答案 1 :(得分:3)
没有动态,如果你有一个有限(或最大)数量的列,可能是这样的:
Cross Apply中的replace()
假设字符串以'/'
(易于扩展或收缩......模式非常清晰)
示例强>
Declare @YourTable table (ID int,[Path] varchar(max))
Insert Into @YourTable values
(1,'/Dev/act/billing')
,(2,'/ST/recManage/prod/form')
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 (Select Cast('<x>' + replace(substring(A.Path,2,len(A.Path)),'/','</x><x>')+'</x>' as xml) as xDim) as A
) B
<强>返回强>
编辑 - 略有简化的版本
注意停滞Pos1
和/x[2]
Select A.ID
,Pos1 = xDim.value('/x[2]','varchar(max)')
,Pos2 = xDim.value('/x[3]','varchar(max)')
,Pos3 = xDim.value('/x[4]','varchar(max)')
,Pos4 = xDim.value('/x[5]','varchar(max)')
,Pos5 = xDim.value('/x[6]','varchar(max)')
From @YourTable A
Cross Apply ( Select Cast('<x>' + replace(A.Path,'/','</x><x>')+'</x>' as xml) ) B (xDim)