如何在SQL查询中按逗号分隔提取自定义字符串片段?
解决方案
核心思路
先统一清理字符串(移除首尾的方括号),再针对清理后的字符串按逗号规则提取内容,这样不管原字符串带不带方括号,都能统一处理:
- 清理字符串:判断字符串首尾是否为
[和],是则截取中间内容,否则保留原字符串 - 提取规则:
- 无逗号:直接返回清理后的字符串
- 含单个逗号:返回第一个逗号后的内容
- 含多个逗号:返回第一个逗号后、第二个逗号前的内容
完整SQL代码
SELECT LTRIM(RTRIM( CASE -- 无逗号,直接返回清理后的字符串 WHEN CHARINDEX(',', cleaned_str) = 0 THEN cleaned_str -- 存在逗号,判断是否有第二个逗号 ELSE CASE -- 有第二个逗号,提取中间部分 WHEN CHARINDEX(',', cleaned_str, CHARINDEX(',', cleaned_str) + 1) > 0 THEN SUBSTRING(cleaned_str, CHARINDEX(',', cleaned_str) + 1, CHARINDEX(',', cleaned_str, CHARINDEX(',', cleaned_str) + 1) - CHARINDEX(',', cleaned_str) - 1) -- 只有一个逗号,提取逗号后的所有内容 ELSE SUBSTRING(cleaned_str, CHARINDEX(',', cleaned_str) + 1, LEN(cleaned_str)) END END )) AS 期望输出 FROM ( -- 第一步:清理首尾方括号 SELECT LTRIM(RTRIM( CASE WHEN LEFT(multi_string, 1) = '[' AND RIGHT(multi_string, 1) = ']' THEN SUBSTRING(multi_string, 2, LEN(multi_string) - 2) ELSE multi_string END )) AS cleaned_str FROM dbo.[multi_string_db] ) AS temp_table
代码说明
- 清理方括号:通过子查询先处理所有字符串,移除首尾的
[和],同时用LTRIM/RTRIM去除多余空格 - 逗号规则处理:
- 用
CHARINDEX判断逗号的存在及位置 - 针对不同逗号数量,分别截取对应的内容,确保带/不带方括号的字符串都能正确处理
- 用
- 兼容场景:既支持原测试数据中的带方括号数组,也能处理不带方括号的多逗号字符串(如
'Some time required, Received documents - Unchecked, Misc'),返回Received documents - Unchecked
内容的提问来源于stack exchange,提问作者Glen Owen
相关产品推荐
相关产品推荐

