选择字符串的一部分

时间:2012-05-24 16:20:21

标签: sql sql-server

我有一组包含目录的完整UNC路径的数据。我想只选择路径(删除服务器/ IP)。我怎么能这样做?

数据:

\\nas.home.example.com\dvd\My First Video
\\nas.office.example.com\business\Report1
\\nas.office.example.com\business\Report2
\\10.10.10.10\projects\proj1\images
\\10.10.10.10\projects\proj1\queries
\\10.10.10.10\projects\proj1\output

预期结果(可以带或不带领先\,我不在乎):

\dvd\My First Video
\business\Report1
\business\Report2
\projects\proj1\images
\projects\proj1\queries
\projects\proj1\output

我已经尝试了以下内容(特定于上述输入之一):

SELECT RIGHT(('\\nas.home.example.com\dvd\My First Video'), 
  CHARINDEX('\', REVERSE('\\nas.home.example.com\dvd\My First Video')));

这只返回最内层的目录(My First Video)。我可以添加一个偏移量来获取父节点,但只有当目录正​​好是这个字符数时才能起作用:

SELECT RIGHT(('\\nas.home.example.com\dvd\My First Video'), 
  CHARINDEX('\', REVERSE('\\nas.home.example.com\dvd\My First Video'))+4);

返回\dvd\My First Video,这对于那个值是好的。如何修改我的查询以适用于我的所有数据值?

我怀疑我可能确实需要其中两个查询。一个用于具有DNS名称的服务器,全部以.com结尾,一个以IP地址结尾,所有这些都以10.10

开头

3 个答案:

答案 0 :(得分:1)

DECLARE @x TABLE (p VARCHAR(255))

INSERT @x SELECT '\\nas.home.example.com\dvd\My First Video'
UNION ALL SELECT '\\nas.office.example.com\business\Report1'
UNION ALL SELECT '\\nas.office.example.com\business\Report2'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\images'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\queries'
UNION ALL SELECT '\\10.10.10.10\projects\proj1\output'
UNION ALL SELECT 'foo.bar\whatever\who';

SELECT p, x = SUBSTRING(p, CHARINDEX('\', SUBSTRING(p, 3, 4000)) + 2, 4000) FROM @x;

结果:

p                                           x
-----------------------------------------   ------------------------
\\nas.home.example.com\dvd\My First Video   \dvd\My First Video
\\nas.office.example.com\business\Report1   \business\Report1
\\nas.office.example.com\business\Report2   \business\Report2
\\10.10.10.10\projects\proj1\images         \projects\proj1\images
\\10.10.10.10\projects\proj1\queries        \projects\proj1\queries
\\10.10.10.10\projects\proj1\output         \projects\proj1\output
foo.bar\whatever\who                        \whatever\who

如果您要删除潜在客户\,请将+ 2更改为+ 3

答案 1 :(得分:1)

与Aaron相同的概念,语法略有不同

SUBSTRING(p, CHARINDEX('\',p,3), 255)

答案 2 :(得分:0)

试试这个(重要的部分是第三行):

DECLARE @str varchar(100)
SET @str = '\\nas.home.example.com\dvd\My First Video'
select substring(@str, CHARINDEX('\', @str, 3), len(@str) - charindex('\', @str, 3))

@str替换为SELECT声明中的列名。

这样做是抓取字符串的子字符串,从第一个字符后面的第一个索引开始,并且字符串的总长度减去第三个字符后的第一个索引“\”。