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

SQL Server 2005中字符串多规则替换问题求助

解决SQL Server 2005中CTE内的字符串多规则替换问题

原语句的核心问题是CASE分支的顺序执行逻辑:当字符串以**开头时,第一个分支会直接返回替换结果,后续的第二个**替换和剩余*替换逻辑根本不会触发。要实现三个规则,必须按顺序完成所有替换步骤,不能用分支跳过后续处理。

修正后的分步实现方案

利用多层CTE分步执行替换规则,逻辑更清晰且兼容SQL Server 2005:

WITH Step1 AS (
    -- 步骤1:替换第一个出现的**为Xx_
    SELECT 
        Name_Orig,
        STUFF(Name_Orig, CHARINDEX('**', Name_Orig), 2, 'Xx_') AS Step1_Result
    FROM YourTable  -- 替换为你的实际表名
),
Step2 AS (
    -- 步骤2:在步骤1结果中替换第二个出现的**为a_
    SELECT 
        Name_Orig,
        Step1_Result,
        CASE
            WHEN CHARINDEX('**', Step1_Result) > 0 
            THEN STUFF(Step1_Result, CHARINDEX('**', Step1_Result), 2, 'a_')
            ELSE Step1_Result
        END AS Step2_Result
    FROM Step1
),
Step3 AS (
    -- 步骤3:将剩余所有*替换为空格
    SELECT 
        Name_Orig,
        Step1_Result,
        Step2_Result,
        REPLACE(Step2_Result, '*', ' ') AS Final_Name
    FROM Step2
)
SELECT * FROM Step3;

逻辑说明

  1. Step1:用STUFF函数定位第一个**的位置,直接替换为Xx_,比原语句的SUBSTRING更通用(即使第一个**不在字符串开头也能处理)。
  2. Step2:在Step1的结果中再次查找**,如果存在则用STUFF替换为a_,不存在则保持Step1结果。
  3. Step3:用REPLACE将Step2结果中所有剩余的*统一替换为空格。

示例验证

输入字符串:**Ang-Stl-A36-6X4X.5**Angle,A36*,4X6X1/2****

  • Step1结果:Xx_Ang-Stl-A36-6X4X.5**Angle,A36*,4X6X1/2****
  • Step2结果:Xx_Ang-Stl-A36-6X4X.5a_Angle,A36*,4X6X1/2****
  • Step3最终结果:Xx_Ang-Stl-A36-6X4X.5a_Angle,A36 ,4X6X1/2

内容的提问来源于stack exchange,提问作者ITBrute

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 20:42:31