SQL Server中如何提取指定子字符串(排除T1/T1 S1)
解决字符串提取与格式转换问题
嘿,我来帮你搞定这个字符串提取的问题!看起来你想要从类似IMIS Event - BITWN1802的内容里提取前面的核心部分(还要把空格换成下划线),同时排除后面的- BITWN1802或者T1/T1 S1这类后缀内容对吧?
你之前尝试用CHARINDEX找最后一个下划线没成功,是因为CHARINDEX默认是从指定位置开始找第一个匹配的下划线,不是最后一个。咱们换个更精准的思路来处理:
方案1:针对带-分隔符的场景
如果你的字符串统一是[目标内容] - [后缀]这种格式,直接定位-这个分隔符的位置,截取前面的内容再替换空格为下划线就可以:
SELECT REPLACE(LEFT([Code], CHARINDEX(' - ', [Code]) - 1), ' ', '_') AS Extracted_Result FROM Your_Table -- 添加筛选确保字符串包含分隔符,避免出现索引越界报错 WHERE CHARINDEX(' - ', [Code]) > 0
举个例子:原字符串是IMIS Event - BITWN1802,CHARINDEX(' - ', [Code])会返回10(从1开始计数),LEFT截取前9个字符得到IMIS Event,再替换空格为下划线就得到IMIS_Event,完全符合你的期望。
方案2:兼容T1/T1 S1后缀的场景
如果还有字符串是IMIS Event T1或者IMIS Event T1 S1这类格式,咱们可以用CASE语句判断不同的分隔情况,确保所有场景都能正确提取:
SELECT REPLACE( LEFT( [Code], CASE -- 优先匹配` - `分隔符 WHEN CHARINDEX(' - ', [Code]) > 0 THEN CHARINDEX(' - ', [Code]) - 1 -- 再匹配` T1`的起始位置 WHEN CHARINDEX(' T1', [Code]) > 0 THEN CHARINDEX(' T1', [Code]) - 1 -- 如果没有匹配到任何分隔符,返回整个字符串(可根据实际需求调整) ELSE LEN([Code]) END ), ' ', '_' ) AS Extracted_Result FROM Your_Table
为什么你之前的方法没生效?
你写的CHARINDEX('_', (REPLACE([Code], ' ', '_')), 4)是从第4个字符开始查找第一个下划线,而不是最后一个。如果一定要用“找最后一个下划线”的思路,需要配合REVERSE反转字符串来实现:
SELECT LEFT( REPLACE([Code], ' ', '_'), LEN(REPLACE([Code], ' ', '_')) - CHARINDEX('_', REVERSE(REPLACE([Code], ' ', '_'))) ) AS Extracted_Result FROM Your_Table
不过这个方法只适合后缀里没有下划线的情况,如果后缀包含下划线就会出错,所以还是前面的两种方案更可靠。
内容的提问来源于stack exchange,提问作者Deepak
相关产品推荐
相关产品推荐

