SQL Server提取带可变尾字符子串的问题求助
解决方案:提取短横与斜杠(或末尾)之间的内容
嘿Rick,我明白你的困扰了——要从带-和可选/的字符串里精准提取中间的数字,用SUBSTRING和CHARINDEX组合时总是踩坑对吧?别担心,我们可以通过判断斜杠是否存在来分情况处理,完美覆盖两种场景。
单个字符串的提取逻辑
假设你的列名为TargetColumn,表名为YourTable,可以用CASE语句分别处理有斜杠和无斜杠的情况:
SELECT TargetColumn AS OriginalString, CASE -- 当字符串包含斜杠时,提取-和/之间的内容 WHEN CHARINDEX('/', TargetColumn) > 0 THEN SUBSTRING( TargetColumn, CHARINDEX('-', TargetColumn) + 1, -- 从短横的下一个字符开始 CHARINDEX('/', TargetColumn) - CHARINDEX('-', TargetColumn) - 1 -- 计算要提取的长度 ) -- 当字符串没有斜杠时,提取短横到末尾的内容 ELSE SUBSTRING( TargetColumn, CHARINDEX('-', TargetColumn) + 1, LEN(TargetColumn) - CHARINDEX('-', TargetColumn) ) END AS ExtractedNumber FROM YourTable;
如果列中是多个空格分隔的片段
如果你的行数据是像AB01-52 AB01-52/1 AB01-53/2 AB01-54这样多个片段用空格拼接的,我们可以先拆分每个片段再提取:
SELECT split.value AS OriginalSegment, CASE WHEN CHARINDEX('/', split.value) > 0 THEN SUBSTRING( split.value, CHARINDEX('-', split.value) + 1, CHARINDEX('/', split.value) - CHARINDEX('-', split.value) - 1 ) ELSE SUBSTRING( split.value, CHARINDEX('-', split.value) + 1, LEN(split.value) - CHARINDEX('-', split.value) ) END AS ExtractedNumber FROM YourTable CROSS APPLY STRING_SPLIT(TargetColumn, ' ') AS split WHERE split.value <> ''; -- 过滤拆分后可能出现的空字符串
逻辑说明
CHARINDEX('-', ...):定位短横-的位置,+1是为了跳过短横本身,从后面第一个字符开始提取- 有斜杠时:用斜杠的位置减去短横的位置再减1,得到
-和/之间的字符长度,精准截取中间部分 - 无斜杠时:用字符串总长度减去短横的位置,得到从短横到末尾的所有字符
这样处理后,不管是AB01-52(提取52)还是AB01-52/1(提取52)都能得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者user3596633
相关产品推荐
相关产品推荐

