一个Sql Query来搜索和替换特定的前缀字符串?

时间:2011-01-28 18:34:40

标签: sql sql-server-2005 string replace

好吧,我有这样的事情(我搞砸了......) -

Id Name                     City
1  XXX - New                Plano
2  XXX - XXX - New1         Dallas
3  XXX - XXX - XXX - New2   Sacramento
4  XXX - New3               Houston
5  XXX - XXX - New4         Austin

所以,我希望将所有出现的内容替换为只有一个XXX前缀。例如,id 2应该具有Name = XXX - New2。如何实现这一目标?即使是基本上检查前缀并用名称替换它的查询也会起作用我认为然后我可以再次添加前缀?我的意思是设置所有记录只是说NewNew2 ..等等...然后我可以添加XXX前缀吗?

7 个答案:

答案 0 :(得分:5)

您可以使用字符串replace功能删除“XXX - ”的所有实例。

UPDATE tableName
SET Name = Replace(Name, 'XXX - ', '')

或者,要保留单个实例,您可以使用:

UPDATE tableName
SET Name = 'XXX - ' + Replace(Name, 'XXX - ', '')
WHERE CHARINDEX('XXX - ', Name) > 0

答案 1 :(得分:2)

您想要删除字符串“XXX -”的出现次数2到n。 这假设最终的数据需要保留:

SELECT 'Starting' --also sets @@ROWCOUNT
WHILE @@ROWCOUNT <> 0
    UPDATE
       Bollixedtable
    SET
       name = STUFF (name, 7, 6, '')
    WHERE
       SUBSTRING (name, 7, 6) = 'XXX - '

否则,如果您想重新开始,这将删除XXX并根据XXX - New(id-1)模式重置您的数据,不使用过滤器

    UPDATE
       Bollixedtable
    SET
       name = 'XXX - New' + CAST(id-1 AS varchar)

编辑:为清晰起见而更新

答案 2 :(得分:1)

Update Table
Set Name = Replace(
                Replace(
                    Replace( Name, ' - XXX - ', ' - ')
                    , ' - XXX - ', ' - ')
                , ' - XXX - ', ' - ')

此解决方案应处理大多数变体。例如,它将处理所有出路:

XXX - XXX - XXX - XXX - XXX - XXX - XXX - XXX - New2

如果您需要进一步处理,可以直接添加另一个替换呼叫。

答案 3 :(得分:1)

取决于数据及其统一程度。如果您的所有数据都属于您问题中的格式,那么最简单的就是:

SELECT
    ID,
    'XXX - ' + SUBSTRING(NAME, CHARINDEX('NEW',NAME),LEN(Name)-CHARINDEX('NEW',NAME)) AS Name,
    CITY
FROM
    FOO

否则,它会变得更加复杂。告诉我们更多关于数据的统一性以及您将遇到的格式,例如,您可以XXXX - XXXX - XXXX - XXXX - ad infintum吗?

答案 4 :(得分:1)

假设您只想在最后一个“-”之前删除所有部分的字符串,然后再次添加前缀,您可以使用:

UPDATE tblWhatever
SET Name = 'NewPrefix - ' + RIGHT(Name, CHARINDEX(' - ',REVERSE(Name))-1)

这基本上是搜索最后一次出现的“-”,然后使用right()函数来获取字符串的最后一部分。然后它将前缀附加到该。

这基本上就是你在问题的最后部分所描述的内容。

答案 5 :(得分:0)

update myTable 
set name = rtrim(ltrim(replace(name, 'XXX - XXX', 'XXX - '))) 

update myTable 
set name = rtrim(ltrim(substring(name, charindex(name, '-'), len(name)))) 
where name like '%-%' 

答案 6 :(得分:0)

declare @loop bit
set @loop = 1

while @loop
begin
  update table
  set name = right(name,len(name)-6)
  where left(name,12) = 'xxx - xxx - '

  set @loop = @@rowcount
end