使用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
相关产品推荐
相关产品推荐

