如何从SQL数据表特定行的两个分隔符间提取目标字符串?
问题:提取冒号与逗号间字符串失败,求修正方案
需求:从数据表df的col1列中,提取位于**冒号(:)和第一个逗号(,)**之间的字符串,生成包含result列的df_final表。当前使用的SQL返回整行字符串,无法正确提取目标内容。
原数据表(df)
| col1 | col2 |
|---|---|
| Patient 001 data retrieved: 9089800, John,Doe | CA |
| Hospital stay | AZ |
| Patient 002 data retrieved: 9123010, Steve,Doe | NY |
| Patient 003 data retrieved: 9034291, Alex,Doe | MI |
| Patient 004 information not found | VT |
目标数据表(df_final)
| col1 | col2 | result |
|---|---|---|
| Patient 001 data retrieved: 9089800, John,Doe | CA | 9089800 |
| Hospital stay | AZ | |
| Patient 002 data retrieved: 9123010, Steve,Doe | NY | 9123010 |
| Patient 003 data retrieved: 9034291, Alex,Doe | MI | 9034291 |
| Patient 004 information not found | VT |
原错误SQL
SELECT TOP 100 *, SUBSTRING(col1,CHARINDEX('data retrieved:',col1)+1, (((LEN(col1))-CHARINDEX(',', REVERSE(col1)))-CHARINDEX('data retrieved:',col1))) AS Result FROM df
问题分析
原SQL的核心问题:
- 依赖固定短语
data retrieved:定位起始点,忽略了冒号才是真正的分隔符,且短语后还有空格,导致起始位置计算错误。 - 使用
REVERSE(col1)找逗号,会定位到最后一个逗号,而非冒号后的第一个逗号,导致截取长度错误。
修正后的SQL方案
SELECT col1, col2, CASE WHEN CHARINDEX(':', col1) > 0 AND CHARINDEX(',', col1, CHARINDEX(':', col1)) > 0 THEN SUBSTRING( col1, CHARINDEX(':', col1) + 2, -- 跳过冒号和后续空格 CHARINDEX(',', col1, CHARINDEX(':', col1)) - CHARINDEX(':', col1) - 2 ) ELSE '' -- 无匹配时返回空字符串 END AS result FROM df
代码解释
CHARINDEX(':', col1):定位col1中冒号的位置。CHARINDEX(',', col1, CHARINDEX(':', col1)):从冒号位置开始查找第一个逗号,确保只截取冒号后的目标内容。SUBSTRING参数:起始位置设为冒号位置+2(跳过冒号和空格),长度为逗号位置-冒号位置-2,精准截取两者之间的字符串。CASE WHEN判断:仅当同时存在冒号和冒号后的逗号时执行截取,避免无匹配时返回错误内容。
执行结果
运行修正后的SQL,将得到与df_final完全一致的结果。
内容的提问来源于stack exchange,提问作者Trevor M
相关产品推荐
相关产品推荐

