You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 15:08:29