我有一个看起来像这样的字符串:
Y:\Data\apples\oranges\Scott\notes
我需要一个如下所示的列:
apples\oranges
这是我到目前为止所做的,它不起作用:
SELECT SUBSTRING(
[Group],
CHARINDEX('\', [Group]) + 1,
LEN([Group]) - CHARINDEX('\', [Group]) - CHARINDEX('\', REVERSE([Group]))
) from datamap.finaltest
字符串不会总是有一定数量的斜杠。例如,您可以:
Y:\Data\Apples\bananas
Y:\Apples\Pears\oranges\peanuts
数据总是有:
drive letter + '\' + '1st level folder' + '\' + 'Second level folder'
但它可能有两个以上的级别。
我搜索过论坛但找不到具体内容。
由于
答案 0 :(得分:2)
可能不是最好的方式,但这会让你到那儿。
DECLARE @string varchar(255) = 'Y:\data\apples\oranges\Scott\notes'
SELECT LEFT(RIGHT(@string,LEN(@string)-CHARINDEX('\', @string, CHARINDEX('\', @string,1) + 1)),CHARINDEX('\', RIGHT(@string,LEN(@string)-CHARINDEX('\', @string, CHARINDEX('\', @string,1) + 1)), CHARINDEX('\',RIGHT(@string,LEN(@string)-CHARINDEX('\', @string, CHARINDEX('\', @string,1) + 1)),1)+1)-1)
答案 1 :(得分:2)
一种公然的方法,将输入转换为XML并按节点获取值并重新连接输出中所需的节点
;WITH MyTempData
AS
(
SELECT Convert(xml,'<n>'+Replace('Y:\Data\Apples','\','</n><n>')+'</n>') XMLString
)
SELECT COALESCE(XMLString.value('(/n[3])', 'varchar(20)'),'') + '\' +
COALESCE(XMLString.value('(/n[4])', 'varchar(20)'),'') MyFinalOutput
FROM MyTempData
答案 2 :(得分:1)
这是一种使用递归CHARINDEX
declare @var varchar(4000) = 'Y:\Data\apples\oranges\Scott\notes'
declare @firstSlash int = (select CHARINDEX('\',@var,CHARINDEX('\',@var) + 1))
declare @fourthSlash int = (select CHARINDEX('\',@var,CHARINDEX('\',@var,CHARINDEX('\',@var,CHARINDEX('\',@var) + 1)+1)+1))
select SUBSTRING(@var,@firstSlash + 1,@fourthSlash - @firstSlash - 1)
或者,对于您的数据表......
select SUBSTRING([Group],CHARINDEX('\',[Group],CHARINDEX('\',[Group]) + 1) + 1,CHARINDEX('\',[Group],CHARINDEX('\',[Group],CHARINDEX('\',[Group],CHARINDEX('\',[Group]) + 1)+1)+1) - CHARINDEX('\',[Group],CHARINDEX('\',[Group]) + 1) - 1)
答案 3 :(得分:1)
如果这是您经常需要做的事情,或者很容易改变,那么实现一个可以使您的代码更易读/可维护的功能可能是有益的:
SELECT SUBSTRING(@t, dbo.CHARINDEX2('\', @t, 2) + 1, dbo.CHARINDEX2('\', @t, 3));
使用此'find nth occurence'功能: http://www.sqlservercentral.com/scripts/Miscellaneous/30497/