SQL中未知位置提取子串:截取第9个/后的内容
提取第9个"/"之后的字符串解决方案
问题说明
有一列(原问题名为VALUE,SQL语句中写为S.SCOPE,需注意表与列的对应关系),数据格式为用/分隔的字符串,示例如下:
00002824/04456/0009639/6410/00001/00001/COL/07/00001/001/0052/01/06/0090139177/WHTG_/000000000000419138
需要提取第9个"/"之后的所有内容,示例中目标结果为:
0052/01/06/0090139177/WHTG_/000000000000419138
原SQL的问题
你写的嵌套CHARINDEX语句存在两个明显问题:
FROM子句错误:应该是FROM 表名(比如你的表名为S),而非FROM S.SCOPE- 嵌套层数与后续的
+1计算混乱,导致起始位置偏移,无法正确定位第9个/的位置
可行解决方案
方案一:修正嵌套CHARINDEX写法(兼容所有SQL Server版本)
通过精准嵌套CHARINDEX定位第9个/的位置,再用SUBSTRING截取后续内容:
SELECT SUBSTRING(S.SCOPE, -- 定位第9个"/"的位置,然后+1作为截取起始点 CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE, CHARINDEX('/', S.SCOPE) + 1) + 1) + 1) + 1) + 1) + 1) + 1) + 1, LEN(S.SCOPE) -- 截取到字符串末尾,超出长度会自动截断 ) AS extracted_value FROM S; -- 这里S是你的表名,确保列S.SCOPE存在
方案二:用STRING_SPLIT+STRING_AGG(SQL Server 2016+)
如果你的SQL Server版本支持STRING_SPLIT,可以更直观地分割字符串后筛选拼接:
SELECT STRING_AGG(value, '/') AS extracted_value FROM ( -- 分割字符串并给每个片段编号 SELECT value, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS segment_num FROM STRING_SPLIT(S.SCOPE, '/') ) t WHERE segment_num > 9; -- 取第9个片段之后的所有内容拼接
注意:SQL Server 2022之前的
STRING_SPLIT不保证片段顺序,如果需要严格按原字符串顺序,建议用方案三。
方案三:用OPENJSON(SQL Server 2016+,保证顺序)
OPENJSON会保留原字符串的分割顺序,适合对顺序要求严格的场景:
SELECT STRING_AGG(value, '/') AS extracted_value FROM OPENJSON('["' + REPLACE(S.SCOPE, '/', '","') + '"]') WITH ( value VARCHAR(MAX) '$', segment_index INT '$[key]' -- 从0开始计数 ) WHERE segment_index >= 9; -- 第9个"/"对应第10个片段(索引9),取之后的所有内容
内容的提问来源于stack exchange,提问作者Newbie
相关产品推荐
相关产品推荐

