如何提取TrackNo字段中第三个连字符后的所有字符?
提取第三个连字符后的内容
问题描述
有一个TrackNo字段,示例值如下:
8070444981-010023-013123-INBBTC-C 601724-072923-078923-INAAAX-B
需要提取第三个-之后的全部内容(包含该连字符),预期结果:
-INBBTC-C -INAAAX-B
之前尝试的SUBSTRING+CHARINDEX写法逻辑有误,导致无法适配所有场景,原语句:
select substring( Trackno, charindex('-', TrackNo , (charindex('-', TrackNo , 1)) +charindex('-', TrackNo, (charindex('-', TrackNo , 1))+1)),20) from table
解决方案
方法1:嵌套CHARINDEX定位第三个连字符
通过三次嵌套CHARINDEX精准定位第三个-的位置,再用SUBSTRING从该位置截取到字符串末尾:
SELECT SUBSTRING(TrackNo, CHARINDEX('-', TrackNo, CHARINDEX('-', TrackNo, CHARINDEX('-', TrackNo, 1) + 1) + 1), LEN(TrackNo)) FROM your_table;
解释:
- 第一层
CHARINDEX('-', TrackNo, 1):找到第一个-的位置 - 第二层
CHARINDEX('-', TrackNo, 第一层结果 + 1):在第一个-之后找第二个-的位置 - 第三层
CHARINDEX('-', TrackNo, 第二层结果 + 1):在第二个-之后找第三个-的位置 - 用
SUBSTRING从第三个-的位置开始截取到字符串结尾,用LEN(TrackNo)替代固定长度20,确保适配所有长度的后续内容
方法2:使用STRING_SPLIT(SQL Server 2016及以上版本)
如果你的SQL Server版本支持STRING_SPLIT,可以通过拆分字符串再拼接的方式实现:
SELECT CONCAT('-', STRING_AGG(value, '-')) AS Result FROM your_table CROSS APPLY STRING_SPLIT(TrackNo, '-') WHERE ordinal > 3 GROUP BY TrackNo;
解释:
STRING_SPLIT按-拆分字符串,ordinal字段记录拆分后片段的顺序- 筛选
ordinal > 3的片段(即第四个及以后的内容) - 用
STRING_AGG将这些片段用-拼接,再加上开头的-得到目标结果
内容的提问来源于stack exchange,提问作者user3933327
相关产品推荐
相关产品推荐

