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

