2016-09-27 142 views
5

我有一个字符串,它看起来像这样之间串:获得第二和第四斜线

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

你可以尝试使用'for xml' CSV中的一种将表格拆分器拆分并选择3d和4记录吗?只是谷歌tsql拆分CSV(提示:它可以是任何分隔符,甚至反斜杠)。 – ajeh

+0

是任何一个常量的路径数据?这里的关键是找到一个适合您所有潜在数据的模式 –

+0

@AlanWaage我刚刚更新了问题并回答了这个问题。总是有驱动器盘符和前两个文件夹级别之后,它可以更多但不会更少。 – VinnyGuitara

回答

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) 
+0

这不起作用。给我“传递给LEFT或SUBSTRING函数的长度参数无效” – VinnyGuitara

+0

@VinnyGuitara它可以与提供的示例一起工作,但如果只有三个深度,它必须以\结尾,否则它会崩溃。 –

+0

你是对的。我更新了添加最后的斜线!谢谢 – VinnyGuitara

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) 
+0

,除了Y:\ Data \ Apples \ bananas,因为最后一个斜杠不存在。但为了解决简单的问题,在每个字符串的末尾添加一个'\',并且此函数可以工作,这比首先测试它的存在更容易。 – Matt

+0

真@Matt我只是认为它会在那里,因为OP说第二和第四斜线之间,第二和第三文件夹层次,这可能是他们真的 – scsimon

1

您的输入转换为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 
1

如果这是你需要经常做一些事情,否则很容易出现变化,它可能是有益的实现的功能,这将使你的代码更易读/维护:

SELECT SUBSTRING(@t, dbo.CHARINDEX2('\', @t, 2) + 1, dbo.CHARINDEX2('\', @t, 3)); 

使用这种“发现第n个occurence '功能: http://www.sqlservercentral.com/scripts/Miscellaneous/30497/