获取第二个和第四个斜杠之间的子串

时间:2016-09-27 19:59:25

标签: sql sql-server sql-server-2008-r2

我有一个看起来像这样的字符串:

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'

但它可能有两个以上的级别。

我搜索过论坛但找不到具体内容。

由于

4 个答案:

答案 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/