2012-07-09 60 views
2

我有名字txt_Full_Path一個SQL欄下方解析字符2008

E:/My_Users//kpa1/eOReport - VSD.mrk 
E:/My_Users//krishr9/Report.mrk 
E:/My_Users//kristc/AllPAS.mrk 
E:/My_Users//kukerm/v1.mrk  
E:/My_Users//ksnedike/abcdef.mrk 

給出具有數據我如何才能從左至右移動的「//」第一次出現後的價值?

這樣我就可以在新列中獲得這些值。

kpa1 
krishr9 
kristc 
kukerm 
ksnedike 

回答

3
DECLARE @x TABLE(y VARCHAR(64)) 

INSERT @x SELECT 'E:/My_Users//kpa1/eOReport - VSD.mrk' 
UNION ALL SELECT 'E:/My_Users//krishr9/Report.mrk' 
UNION ALL SELECT 'E:/My_Users//kristc/AllPAS.mrk' 
UNION ALL SELECT 'E:/My_Users//kukerm/v1.mrk' 
UNION ALL SELECT 'E:/My_Users//ksnedike/abcdef.mrk'; 

SELECT y, part = SUBSTRING(y, 2, CHARINDEX('/', y, 2)-2) 
FROM (SELECT y = SUBSTRING(y, CHARINDEX('//', y) + 1, 64) FROM @x) AS z; 

結果:

y       part 
------------------------ ---------- 
/kpa1/eOReport - VSD.mrk kpa1 
/krishr9/Report.mrk  krishr9 
/kristc/AllPAS.mrk  kristc 
/kukerm/v1.mrk   kukerm 
/ksnedike/abcdef.mrk  ksnedike 

您還可能遇到在沒有拖尾後續/字符的情況下,例如'E:/foo//bar' - 如果這樣的話:

SELECT y, part = SUBSTRING(y, 2, COALESCE(NULLIF(CHARINDEX('/', y, 2),0),66)-2) 
FROM (SELECT y = SUBSTRING(y, CHARINDEX('//', y) + 1, 64) FROM @x) AS z; 
+0

嗨亞倫,泰您的帖子。它確實有效。我的列中有2000+個值,名爲txt_Full_Path。編寫UNION ALL SELECT將很乏味。有沒有更簡單的方法來查詢我的專欄瓦特/ o使用表變量? TIA。 – Nemo 2012-07-09 18:27:26

+2

@Nemo,那只是設置示例數據來演示給出您在問題中列出的值的輸出。你當然會接受這個查詢,用實際的表名和'y'替換實際的列名。 – 2012-07-09 18:29:12

2

它的醜陋,但它的工作原理:

編輯 ABS()功能在最後部分處理的文件夾沒有 /
SELECT SUBSTRING(YourValue, CHARINDEX('//', YourValue) + 2, 
    ABS(CHARINDEX('/', YourValue, CHARINDEX('//', YourValue) + 2) - 
     (CHARINDEX('//', YourValue) + 2)))  
FROM YourTable 

添加//

+0

雖然承認沒有「壞」數據的指示,但這並不能妥善處理可能丟失第二個'/'實例的情況。 – 2012-07-09 18:29:54

+0

@AaronBertrand - 同意,但因爲它看起來像這是試圖提取用戶文件夾,我認爲(危險!)格式將是一致的。不過,我不相信你的腳本會處理一個丟失的'/'。試試:''E:/ My_Users // krishr9''。我得到一個'無效的長度參數傳遞給子串函數.'錯誤。 – LittleBobbyTables 2012-07-09 18:32:59

+0

是的,您是否在我的答案中看到了第二個腳本,以及介紹它的描述性文字? – 2012-07-09 18:37:43