Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
替换SQL中字符串中第一个出现的子字符串_Sql_Sql Server_Sql Server 2012 - Fatal编程技术网

替换SQL中字符串中第一个出现的子字符串

替换SQL中字符串中第一个出现的子字符串,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我必须从@temp表中获取数据,该表有“或ccc或bbb或aaa”之类的内容。我想将第一个出现的内容替换到空格中,以获得类似“或ccc或bbb或aaa”之类的内容。我尝试了一些东西并替换了它们,但它们似乎并没有达到我想要的效果 我所尝试的: DECLARE @stringhere as varchar(500) DECLARE @stringtofind as varchar(500) set @stringhere='OR contains or cccc or ' set @stri

我必须从@temp表中获取数据,该表有“或ccc或bbb或aaa”之类的内容。我想将第一个出现的内容替换到空格中,以获得类似“或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 ,' ')

您可以结合使用
STUFF
CHARINDEX
来实现您想要的:

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

CHARINDEX('substring',col)
将返回列中第一次出现的
'substring'
的索引
STUFF
然后用
'replacement'

替换此事件。似乎缺少目标字符串前面和后面的2个
%

请尝试:

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

您可以执行
CHARINDEX
PATINDEX
,如上所示,但我还建议添加
合并
,以防
@stringtoFind
未包含在
@stringhere

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

我遇到了与Tim Biegeleisen相同的问题,做出了与Tim Biegeleisen相同的回答,但在一个函数中:

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'

解释是一样的

@user3331798:请try@user3331798:谢谢,但是为什么在
''或contains或cccc或'
中有两个单引号?您是否尝试为动态查询创建where子句?我正在尝试在删除第一个字符串后获取最终值..请了解紧急请求,并被告知,这不是一个适当的方式来解决志愿者。谢谢非常感谢,先生,工作非常好。。。为此搜索了数小时,但没有得到足够好的结果。。。谢谢你很高兴能帮助你。。。你问了一个很好的问题:-)有点晚了(但很惊讶这之前没有被注意到),但这似乎只有在出现
'substring'
时才起作用。如果没有,则返回
null
。所以一个
CASE
表达式来捕捉是可取的。@honeybacker捕捉得很好。或者,我们可以将对
STUFF
的整个调用包装在
COALESCE
中,并用原始列替换空值。