解析SQL Server 2008中的字符

时间:2012-07-09 18:06:35

标签: sql-server sql-server-2008

我有一个名为txt_Full_Path的SQL列,其数据如下所示

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:2)

这很难看,但确实有效:

SELECT SUBSTRING(YourValue, CHARINDEX('//', YourValue) + 2, 
    ABS(CHARINDEX('/', YourValue, CHARINDEX('//', YourValue) + 2) - 
        (CHARINDEX('//', YourValue) + 2)))    
FROM YourTable

修改

ABS()之后的最后一部分添加了/功能,以处理没有//的文件夹。