1

我正在尝试提取文件名(已成功),然后在其自己的列中提取每个文件路径目标。

示例文件路径:mps://Global/Test/Health/Reports/file.html

预期结果(在四个单独的列中):

File.html Reports Health Test Global

我的实际结果(只有两列):

File.html mps://Global/Test/Health/Reports

我的查询:

select 
RIGHT(filepath, CHARINDEX('/', REVERSE(filepath)) -1) AS ReportName
LEFT(filepath,LEN(filepath) - charindex('/',reverse(filepath),1) + 1) AS ReportPath,
from LOG;

我一直在试图弄清楚如何在各自的列中提取每个“/”之间的每个路径。我已经为四个单独的列尝试了许多 charindex 更改,但是在摆脱字符串的左侧和右侧时遇到了麻烦。有任何想法吗?

4

3 回答 3

1

尝试将其转换为 XML,然后以“节点”为目标;

declare @yak varchar(100) = 'mps://Global/Test/Health/Reports/file.html';

declare @x xml = cast('<r><i>' + replace(replace(@yak, 'mps://', ''), '/', '</i><i>') + '</i></r>' as xml);

select  [Col1] = r.n.value('i[1]', 'varchar(100)'),
        [Col2] = r.n.value('i[2]', 'varchar(100)'),
        [Col3] = r.n.value('i[3]', 'varchar(100)'),
        [Col4] = r.n.value('i[4]', 'varchar(100)'),
        [Col5] = r.n.value('i[5]', 'varchar(100)'),
        [Col6] = r.n.value('i[6]', 'varchar(100)')
from    @x.nodes('r')r(n);

回报:

Col1    Col2    Col3    Col4    Col5        Col6
----    ----    ----    ----    ----        ----
Global  Test    Health  Reports file.html   NULL
于 2016-12-08T22:04:47.587 回答
0

我想你可能想要string_split函数。ISTR 一个专门用于将文件名解析为 4 个部分(驱动器、目录、基础、扩展名)的函数,但可能位于 C 运行时库中。

于 2016-12-08T23:34:29.940 回答
0

您可能希望在 charindex 内部使用 case,尤其是在某些文件路径为空的情况下。

于 2016-12-12T14:35:03.520 回答