sql-server - 想要在第 5 和第 6 '/' 之间的字符串输出
问题描述
输入看起来像
/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
声明,基于 JSON:
SELECT JSON_VALUE(CONCAT('["', REPLACE(InputString, '/', '","'), '"]'), '$[5]')
FROM @T
结果:
mediatek
mtl3d
etl1266
笔记:
SQL Server 2016 提供 JSON 支持。
推荐阅读
- ruby-on-rails - Capistrano rails deploy 升级到 rails 5.1.5 失败,仍将当前设置为失败部署
- sql-server - 如何在以前的时间点恢复 SQL Server 数据库
- react-native - 如何从 React Native 中的 SQL 提取中获取一个字段?
- javascript - 将多个对象归为一个
- vb.net - VB替换附加csv中的字符
- xml - 如何在 VB.NET 中反序列化
- python - 如何通过处理连续换行符等情况来读取csv文件?
- docker - Nmake 无法在 docker mount 中找到文件
- android - 如何调整约束布局以滚动视图以适应所有屏幕?
- .htaccess - 由于 .htaccess,我的 CSS #id 无法正常工作