Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用子字符串提取文件路径_Sql_String_Sql Server 2012_Substring_Charindex - Fatal编程技术网

Sql 使用子字符串提取文件路径

Sql 使用子字符串提取文件路径,sql,string,sql-server-2012,substring,charindex,Sql,String,Sql Server 2012,Substring,Charindex,我正在尝试提取文件名(已经成功),然后将每个文件路径目标提取到它自己的列中 示例文件路径:mps://Global/Test/Health/Reports/file.html 预期结果(在四个单独的列中): 我的实际结果(只有两列): 我的问题是: select RIGHT(filepath, CHARINDEX('/', REVERSE(filepath)) -1) AS ReportName LEFT(filepath,LEN(filepath) - charindex('/',rever

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

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

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

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

我的问题是:

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

我一直在试图找出如何提取各自列中每个“/”之间的每个路径。我已经尝试过对四个单独的列进行许多charindex更改,但是在删除字符串的左侧和右侧时遇到了困难。有什么想法吗

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


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

您可能希望在charindex内部使用case,特别是当某些文件路径保留为null时。

这是否需要动态?路径是否可以像
//global/test/health/somemore/somemore/somemore/somemore/somemore/file.html那样更长?是的,可以,但我只举了一个较短的示例,因为我只想返回四个部分,以便澄清。你只需要4个部分,即使它是10个?是的,但从最大的列来看,最大值是6个
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;
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