【问题标题】:Replace first occurrence of substring in a string in SQL替换SQL中字符串中第一次出现的子字符串
【发布时间】:2016-12-19 02:11:47
【问题描述】:

我必须从@temp 表中获取数据,该表具有“或 ccc 或 bbb 或 aaa”之类的内容我正在尝试一些东西并替换,但它们似乎没有让我得到想要的结果

我尝试过的:

DECLARE @stringhere as varchar(500)

DECLARE @stringtofind as varchar(500)

set @stringhere='OR contains or cccc or  '

set @stringtofind='or'
select STUFF('OR contains or cccc or  ',PATINDEX('or', 'OR contains or cccc or  '),0 ,' ')

【问题讨论】:

  • 您是否要为动态查询创建 where 子句?
  • 我试图在删除第一次出现的字符串后获得最终值..
  • read this community discussion关于紧急乞讨,并被告知这不是解决志愿者的适当方式。谢谢!

标签: sql sql-server sql-server-2012


【解决方案1】:

您可以使用STUFFCHARINDEX 的组合来实现您想要的:

SELECT STUFF(col, CHARINDEX('substring', col), LEN('substring'), 'replacement')
FROM #temp

CHARINDEX('substring', col) 将返回'substring' 在列中第一次 出现的索引。 STUFF 然后用'replacement' 替换此事件。

【讨论】:

  • 非常感谢您,先生,工作得非常好...搜索了几个小时没有得到足够好的结果。 ...谢谢你
  • 很高兴为您提供帮助...而且您提出了一个很好的问题:-)
  • 有点晚了(但很惊讶之前没有注意到这一点),但这似乎只有在 出现'substring' 时才有效。如果没有,则返回 null。因此,建议使用 CASE 表达式来捕捉它。
  • @HoneyBadger 不错的收获。或者,我们可以将整个对STUFF 的调用封装在COALESCE 中,并将空值替换为原始列。
【解决方案2】:

您似乎错过了目标字符串前后的 2%

请尝试:

select STUFF(@stringhere, PATINDEX('%' + @stringtofind + '%', @stringhere), LEN(@stringtofind), ' ')

【讨论】:

  • @user3331798:请尝试
  • @user3331798 :谢谢,但为什么'''OR contains or cccc or ' 中有两个单引号?
【解决方案3】:

您可以使用CHARINDEXPATINDEX,如上所示,但我也建议添加COALESCE,以防您的@stringtoFind 不包含在您的@stringhere 中。

SELECT COALESCE(STUFF(@stringhere, PATINDEX('%' + @stringtofind + '%', @stringhere), LEN(@stringtofind), ' '), @stringhere)

【讨论】:

    【解决方案4】:

    我遇到了和蒂姆·比格莱森一样的问题,做出了同样的反应,但是在一个函数中:

    CREATE FUNCTION DBO.FN_REPLACE_FIRST(@X NVARCHAR(MAX), @F NVARCHAR(MAX), @R NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN
    RETURN STUFF(@X, CHARINDEX(@F, @X), LEN(@F), @R)
    END
    

    所以我只调用该函数:

    SELECT DBO.FN_REPLACE_FIRST('Text example', 'ex', 'eexx') --> Returns 'Teexxt example'
    

    解释是一样的

    【讨论】:

      猜你喜欢
      • 2016-05-07
      • 2014-03-21
      • 2020-05-22
      • 2011-12-19
      • 1970-01-01
      • 2011-06-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-25
      相关资源
      最近更新 更多