Sql server 需要介于第5和第6个“/”之间的字符串输出

Sql server 需要介于第5和第6个“/”之间的字符串输出,sql-server,tsql,Sql Server,Tsql,输入看起来像 /nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/ /nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/ /nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/ 输出应该是 mtlmedia mtl3d etl66 我能够成功地获得输出,但是

输入看起来像

/nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/
/nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/
/nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/
输出应该是

mtlmedia
mtl3d
etl66
我能够成功地获得输出,但是是否有其他函数或方法可以简化输出

declare @T table
(
InputString varchar(max)
);

insert into @T values
('/nfs/site/ssd/mtl_workdisk_1/mediatek/filter_candle46/regression/'),
('/nfs/location/disks/mtl_workdisk_003/mtl3d/filter_candle2846/regress/'),
('/nfs/place/disks/mtl_workdisk_003/etl1266/bundle2846/regress/') ;

select -- P1.Pos, P2.Pos, P3.Pos,P4.Pos,P5.Pos,P6.Pos,
substring(InputString, P5.Pos + 1, P6.Pos - P5.Pos - 1) as OutputString
from @T
cross apply (select (charindex('/', InputString))) as P1(Pos)
cross apply (select (charindex('/', InputString, P1.Pos+1))) as P2(Pos)
cross apply (select (charindex('/', InputString, P2.Pos+1))) as P3(Pos)
cross apply (select (charindex('/', InputString, P3.Pos+1))) as P4(Pos)
cross apply (select (charindex('/', InputString, P4.Pos+1))) as P5(Pos)
cross apply (select (charindex('/', InputString, P5.Pos+1))) as P6(Pos) ;

基于内置XML或JSON支持的方法是可能的选项:

语句,基于XML:

SELECT CAST('<x>' + REPLACE(InputString, '/', '</x><x>') + '</x>' AS XML).value('/x[6]','varchar(max)')
FROM @t
结果:

mediatek
mtl3d
etl1266
注:


SQL Server 2016提供JSON支持。

基于内置XML或JSON支持的方法是可能的选项:

语句,基于XML:

SELECT CAST('<x>' + REPLACE(InputString, '/', '</x><x>') + '</x>' AS XML).value('/x[6]','varchar(max)')
FROM @t
结果:

mediatek
mtl3d
etl1266
注:


SQL Server 2016提供了JSON支持。

如果您总是知道路径的根,并且只想知道路径后的第一个子文件夹名称,则可以根据根的长度获得一个子字符串,并使用charindex查找根后的第一个斜杠

declare @paths as table(fullpath varchar(max))

insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/')

declare @root as varchar(max) = '/nfs/site/disks/mtl_workdisk_003/'
declare @startPos as int = len(@root) + 1

select substring(fullpath, @startPos, CHARINDEX('/',fullpath,@startPos) - @startPos) filename
from @paths
where CHARINDEX('/',fullpath,@startPos) > 0
我在末尾使用where子句是为了防止由于某种原因在根目录后找不到子文件夹斜杠时出现任何错误

declare @paths as table(fullpath varchar(max))

insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/')

declare @root as varchar(max) = '/nfs/site/disks/mtl_workdisk_003/'
declare @startPos as int = len(@root) + 1

select substring(fullpath, @startPos, CHARINDEX('/',fullpath,@startPos) - @startPos) filename
from @paths
where CHARINDEX('/',fullpath,@startPos) > 0

如果您总是知道路径的结尾,那么您可以使用REPLACE删除结尾,甚至不必使用CHARINDEX搜索/。

如果您总是知道路径的根,并且只需要后面的第一个子文件夹名称,可以根据根的长度得到一个子字符串,再加上查找根后第一个斜杠的charindex

declare @paths as table(fullpath varchar(max))

insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/')

declare @root as varchar(max) = '/nfs/site/disks/mtl_workdisk_003/'
declare @startPos as int = len(@root) + 1

select substring(fullpath, @startPos, CHARINDEX('/',fullpath,@startPos) - @startPos) filename
from @paths
where CHARINDEX('/',fullpath,@startPos) > 0
我在末尾使用where子句是为了防止由于某种原因在根目录后找不到子文件夹斜杠时出现任何错误

declare @paths as table(fullpath varchar(max))

insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtlmedia/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/mtl3d/filter_bundle2846/regress/')
insert into @paths values ('/nfs/site/disks/mtl_workdisk_003/etl66/filter_bundle2846/regress/')

declare @root as varchar(max) = '/nfs/site/disks/mtl_workdisk_003/'
declare @startPos as int = len(@root) + 1

select substring(fullpath, @startPos, CHARINDEX('/',fullpath,@startPos) - @startPos) filename
from @paths
where CHARINDEX('/',fullpath,@startPos) > 0

如果您总是知道路径的结尾,您可以使用REPLACE删除结尾,甚至不必使用CHARINDEX搜索/。

您的SQL Server版本是什么?SQL Server版本是2012您的SQL Server版本是什么?SQL Server版本是2012有关解决方案的详细信息。关于如何在SQL Server 2012版中执行相同操作的任何线索?@sgsergio XML方法适用于SQL Server 2012,对于JSON方法,您需要SQL Server 2016+。感谢您的解决方案。关于如何在SQL Server 2012版中执行相同操作的任何线索?@sgsergio XML方法适用于SQL Server 2012,对于JSON方法,您需要SQL Server 2016+。