SQL如何提取字符串中第一个与第二个'-'分隔符间的子串
问题背景
表中某字符串类型字段以-作为分隔符存储多段内容,需要提取字段中第一个-和第二个-之间的子串,样例如下:
- 源数据:
ABC-DEF-FG,预期输出:DEF - 源数据:
ABCD-JAFF-UIOU-TYU,预期输出:JAFF
原有写法问题
你之前尝试的三个语句存在两类问题:
- 语法问题:
SELECT *后直接拼接字段属于语法错误,*代表查询所有字段,和自定义提取字段不能直接无逗号拼接 - 逻辑问题:
SUBSTRING函数的第三个参数是需要截取的字符长度,不是截取的结束位置下标。你之前的写法要么直接传了字段总长度导致截取范围溢出,要么直接传第二个-的位置作为长度,没有减去起始位置的偏移量,导致截取结果长度错误。
正确实现语句
核心计算逻辑:
- 定位第一个
-的下标,加1得到截取起始位置 - 从第一个
-的下一位开始向后查找,定位第二个-的下标 - 用第二个
-的下标减去第一个-的下标再减1,得到两个分隔符之间的子串长度
对应SQL语句:
SELECT SUBSTRING( your_column, CHARINDEX('-', your_column) + 1, CHARINDEX('-', your_column, CHARINDEX('-', your_column) + 1) - CHARINDEX('-', your_column) - 1 ) AS target_value FROM your_table
兼容提示:如果表中存在不足两个
-的异常格式数据,上述语句会返回异常结果,建议提前过滤不符合格式的数据,或通过CASE WHEN判断分隔符数量后再做截取。
内容的提问来源于stack exchange,提问作者user09
相关产品推荐
相关产品推荐

