2016-09-27 93 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/