【问题标题】:A Sql Query to search and replace specific prefixed strings?用于搜索和替换特定前缀字符串的 Sql 查询?
【发布时间】:2011-06-17 10:29:22
【问题描述】:

好吧,我有这样的东西(我搞砸了......) -

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 前缀替换所有出现的事件,只替换为 1。例如,id 2 应该具有 Name=XXX - New2。将如何实现这一目标?我认为,即使是基本上检查前缀并将其替换为名称的查询也可以工作,然后我可以再次添加前缀?我的意思是设置所有记录只是为了说New,New2..等等...然后我可以添加XXX前缀?

【问题讨论】:

  • 所有的xxx都一样吗?
  • 是的 xxx 是一样的..感谢 evryone 的 rplies...srry 延迟回复..被赶上..

标签: sql sql-server-2005 string replace


【解决方案1】:

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

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

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

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

【讨论】:

  • 难道 OP 不想保留一个实例吗?
  • @gbn, @nathan gonzalez:他们确实说过,即使只用名称替换记录,这样他们就可以重新添加一个“XXX -”。我会更新我的答案以保留一个实例
  • 1.您的解决方案在更新之前不完整:它不提供解决 OP 数据问题的端到端解决方案。 2.当只有少数可能被破坏时,它会更新每一行=可能是一个大事务。
  • @gbn: 1. 正如我所指出的,它只解决了删除前缀的问题。用户将不得不重新添加前缀。我从来没有声称它会这样做。 2. 我再次更新以替换为单个实例,并且只修改已经包含起始前缀的记录。感谢您指出遗漏。
【解决方案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 - New(id-1) 模式删除 XXX 并重置您的数据,没有过滤器

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

编辑:为清晰起见更新

【讨论】:

  • 这不会删除所有实例,而不是只删除一个吗?
  • @nathan gonzalez:不,它看起来只是每次迭代中的第二次出现
  • 啊,我现在明白了……必须更加注意我喜欢的子字符串的开头。比我的干净一点。 +1\
  • 为了彻底,这里还假设不需要保留原始数据...即您想要更新表中的数据,而不仅仅是在其上创建一个视图或从中选择数据,并去除额外的“XXX -”出现。
  • @Richard,我认为操作员把他的桌子搞砸了,并试图修复它。选择并不能真正解决任何问题。
【解决方案3】:

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

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】:
    Update Table
    Set Name = Replace(
                    Replace(
                        Replace( Name, ' - XXX - ', ' - ')
                        , ' - XXX - ', ' - ')
                    , ' - XXX - ', ' - ')
    

    此解决方案应能处理大多数变体。例如,它将一路处理到:

    XXX - XXX - XXX - XXX - XXX - XXX - XXX - XXX - New2.

    如果您需要进一步处理,只需添加另一个 Replace 调用即可。

    【讨论】:

      【解决方案5】:

      假设你只是想去掉最后一个“-”之前的所有部分的字符串,然后再添加一个前缀,你可以这样使用:

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

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

      这基本上就是您在问题的最后一部分中描述的内容。

      【讨论】:

        【解决方案6】:
        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 '%-%' 
        

        【讨论】:

          【解决方案7】:
          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
          

          【讨论】:

            猜你喜欢
            • 2015-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-21
            • 2017-05-14
            • 2011-10-05
            • 1970-01-01
            • 2015-11-13
            相关资源
            最近更新 更多