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

SQL Server提取每行两个连字符间文本的技术求助

SQL Server提取两个'-'间内容的正确实现方案

需求说明

提取文本行中两个'-'之间的内容;若该行无'-',则保留原文本。

样例输入

AB DCE
CM-AB DCE  -228
ABC
CM-AB DCE-214
CJ-ABC-228

期望输出

AB DCE
AB DCE
ABC
AB DCE
ABC

问题分析

原尝试语句select substring(mycol, 4, charindex('-', mycol, 12) )依赖固定起始位置和搜索偏移,无法适配不同行的格式差异,导致结果不准确。

正确实现方案

方案一:兼容全版本的SUBSTRING+CHARINDEX方案

适用于所有SQL Server版本,通过字符位置计算提取目标内容:

SELECT 
    CASE
        -- 判断行中是否存在至少两个'-'
        WHEN LEN(mycol) - LEN(REPLACE(mycol, '-', '')) >= 2
            THEN SUBSTRING(
                    mycol,
                    -- 起始位置:第一个'-'的下一位
                    CHARINDEX('-', mycol) + 1,
                    -- 截取长度:第二个'-'位置减去第一个'-'位置再减1
                    CHARINDEX('-', mycol, CHARINDEX('-', mycol) + 1) - CHARINDEX('-', mycol) - 1
                )
        -- 无'-'或不足两个'-'时返回原文本
        ELSE mycol
    END AS extracted_content
FROM your_table;

方案二:SQL Server 2016+可用的STRING_SPLIT方案

利用字符串拆分函数简化逻辑,注意SQL Server 2022之前STRING_SPLIT不保证拆分结果顺序,需确认业务场景是否兼容:

SELECT 
    CASE
        WHEN LEN(mycol) - LEN(REPLACE(mycol, '-', '')) >= 2
            THEN (SELECT value FROM STRING_SPLIT(mycol, '-') ORDER BY (SELECT NULL) OFFSET 1 ROW FETCH NEXT 1 ROW ONLY)
        ELSE mycol
    END AS extracted_content
FROM your_table;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 19:02:03