我有一组包含目录的完整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
答案 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
声明中的列名。
这样做是抓取字符串的子字符串,从第一个字符后面的第一个索引开始,并且字符串的总长度减去第三个字符后的第一个索引“\”。