如何在SQL Server中按第二个大写字符拆分列
问题分析
你的需求是将Textcolumn列按小写字符之后出现的第一个大写字符作为分隔符拆分:拆分后左侧为该大写字符前的部分,右侧为该字符及之后的部分;若不存在这样的大写字符,右侧列返回NULL,左侧列保留原字符串。
原SQL存在两个核心问题:
- 仅将首字母转为小写,后续大写字符仍保留,但当字符串无后续大写时,
PATINDEX('%[A-Z]%', LoweredText)返回0,导致SUBSTRING的长度参数为-1,引发错误。 - 错误将首字母的大写纳入分隔符判断,而实际需要从第二个字符开始,查找小写后跟随的大写字符作为拆分点。
解决方案
使用PATINDEX匹配%[a-z][A-Z]%模式(小写字符后跟大写字符),精准定位拆分位置,再通过LEFT和SUBSTRING完成拆分:
SELECT Textcolumn, -- 找到小写后跟大写的位置,取前面的部分;无则返回原字符串 CASE WHEN PATINDEX('%[a-z][A-Z]%', Textcolumn) > 0 THEN LEFT(Textcolumn, PATINDEX('%[a-z][A-Z]%', Textcolumn)) ELSE Textcolumn END AS leftcol, -- 从拆分位置的下一位开始取,无则返回NULL CASE WHEN PATINDEX('%[a-z][A-Z]%', Textcolumn) > 0 THEN SUBSTRING(Textcolumn, PATINDEX('%[a-z][A-Z]%', Textcolumn) + 1, LEN(Textcolumn)) ELSE NULL END AS rightcol FROM sc_join_group;
逻辑说明
PATINDEX('%[a-z][A-Z]%', Textcolumn):返回第一个“小写+大写”组合的起始位置,例如SzhH中匹配hH,返回位置3;无匹配则返回0。- 当存在匹配时:
LEFT取到匹配位置的字符(即大写字符前的所有内容),SUBSTRING从匹配位置+1开始取(即大写字符及之后的内容)。 - 当无匹配时:左侧列保留原字符串,右侧列返回
NULL,完全符合你的期望结果。
内容的提问来源于stack exchange,提问作者Phạm Tấn Thành
相关产品推荐
相关产品推荐

