You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SQL Server中按第二个大写字符拆分列

问题分析

你的需求是将Textcolumn列按小写字符之后出现的第一个大写字符作为分隔符拆分:拆分后左侧为该大写字符前的部分,右侧为该字符及之后的部分;若不存在这样的大写字符,右侧列返回NULL,左侧列保留原字符串。

原SQL存在两个核心问题:

  1. 仅将首字母转为小写,后续大写字符仍保留,但当字符串无后续大写时,PATINDEX('%[A-Z]%', LoweredText)返回0,导致SUBSTRING的长度参数为-1,引发错误。
  2. 错误将首字母的大写纳入分隔符判断,而实际需要从第二个字符开始,查找小写后跟随的大写字符作为拆分点。
解决方案

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 19:50:28