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

使用T-SQL提取字符串第二与第三下划线间值并处理空值问题

T-SQL 提取字符串第二个与第三个下划线之间值的解决方案

适用场景

兼容以下边界情况:

  • 字符串存在3个及以上下划线:正常提取第二个与第三个下划线之间的内容
  • 字符串仅存在2个下划线:提取第二个下划线之后到末尾的内容
  • 字符串下划线数量不足2个:返回NULL

方案1:兼容所有SQL Server版本的原生写法

无需依赖高版本函数,通过CHARINDEX嵌套定位下划线位置实现:

SELECT 
    原字符串列,
    CASE
        -- 不存在第二个下划线直接返回NULL
        WHEN CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1) = 0 THEN NULL
        ELSE SUBSTRING(
            原字符串列,
            -- 第二个下划线的下一个位置作为提取起点
            CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1) + 1,
            CASE
                -- 不存在第三个下划线时提取到字符串末尾
                WHEN CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1) + 1) = 0
                THEN LEN(原字符串列) - CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1)
                -- 存在第三个下划线时提取到第三个下划线前一位
                ELSE CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1) + 1) - CHARINDEX('_', 原字符串列, CHARINDEX('_', 原字符串列) + 1) - 1
            END
        )
    END AS 提取结果
FROM 你的业务表名

验证示例

使用提供的测试数据验证结果完全匹配:

  • 输入sss_ss_d_a,输出d
  • 输入aaa_dd_b,输出b
  • 输入aaa_aa,输出NULL

方案2:SQL Server 2022+ 简化写法

SQL Server 2022及以上版本支持STRING_SPLIT的ordinal参数(返回分割后元素的原始序号),写法更简洁易读:

SELECT 
    t.原字符串列,
    s.value AS 提取结果
FROM 你的业务表名 t
OUTER APPLY (
    SELECT value 
    FROM STRING_SPLIT(t.原字符串列, '_', 1) 
    WHERE ordinal = 3
) s

该写法自动处理所有边界情况,没有对应序号的元素时自动返回NULL,逻辑和结果和方案1完全一致。

内容的提问来源于stack exchange,提问作者anders1990

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 18:39:01