替换字符串中出现的字符

问题描述 投票:0回答:1

Name_Orig
列中的值如下所示:
**Ang-Stl-A36-6X4X.5**Angle,A36*,4X6X1/2****

我想要

  • 第一次出现 ** 时替换为 Xx_
  • 第二次出现 ** 时替换为 _
  • 将所有其他 * 替换为空格

这不是一个完整的表格,但是,这些条件集都在通用表表达式(CTE)中

我可以替换第一次出现的 ** 对于第二点和第三点,查询不起作用

CASE 
When Name_Orig LIKE '**%' THEN 'Xx_'+ SUBSTRING(Name_Orig, 3, LEN(Name_Orig)-2)
WHEN CHARINDEX('**', Name_Orig, CHARINDEX('**', Name_Orig) + 1) > 0 THEN 
                REPLACE(STUFF(Name_Orig, CHARINDEX('**', Name_Orig, CHARINDEX('**', Name_Orig) + 1), 2, 'a_'), '*', ' ')
            ELSE Name_Orig
END

使用 SQL Server 2005。

sql sql-server sql-server-2005
1个回答
0
投票

正如 Squirrel 所评论的,使用

patindex
找到第一个和第二个
**
,然后使用
replace
删除任何剩余的
8

select a.TestValue, replace(e.NewString,'*',' ')
from (
  values ('**Ang-Stl-A36-6X4X.5**Angle,A36*,4X6X1/2****')
) a (TestValue)
cross apply (
  values (patindex('%**%', a.TestValue))
) b (FirstPat)
cross apply (
  values (case when b.FirstPat > 0 then substring(a.TestValue, 1, b.FirstPat - 1) + 'Xx_' + substring (a.TestValue, b.FirstPat + 2, len(a.TestValue)) else a.TestValue end)
) c (NewString)
cross apply (
  values (patindex('%**%', c.NewString))
) d (SecondPat)
cross apply (
  values (case when d.SecondPat > 0 then substring(c.NewString, 1, d.SecondPat - 1) + 'a_' + substring (c.NewString, d.SecondPat + 2, len(c.NewString)) else c.NewString end)
) e (NewString)

退货:

测试值 新价值
Ang-Stl-A36-6X4X.5角度,A36*,4X6X1/2**** Xx_Ang-Stl-A36-6X4X.5a_角度,A36,4X6X1/2

DBFiddle

© www.soinside.com 2019 - 2024. All rights reserved.