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;
逻辑说明
- Step1:用
STUFF函数定位第一个**的位置,直接替换为Xx_,比原语句的SUBSTRING更通用(即使第一个**不在字符串开头也能处理)。 - Step2:在Step1的结果中再次查找
**,如果存在则用STUFF替换为a_,不存在则保持Step1结果。 - 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
相关产品推荐
相关产品推荐

