0

我有一组数据,其中包含目录的完整 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);

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

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

4

3 回答 3

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.

于 2012-05-24T16:23:09.717 回答
1

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

SUBSTRING(p, CHARINDEX('\',p,3), 255)
于 2012-05-24T16:28:56.627 回答
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

这样做是在第三个字符之后从 '\' 的第一个索引开始获取字符串的子字符串,并且字符串的总长度减去第三个字符之后的第一个索引 '\' 的长度。

于 2012-05-24T16:27:59.420 回答