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

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

我必须从 @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 ,' ')
sql sql-server sql-server-2012
6个回答
59
投票

您可以使用

STUFF
CHARINDEX
的组合来实现您想要的:

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

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


3
投票
看来你错过了目标字符串前面和后面的 2 个

%



请尝试:

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

2
投票
您可以执行

CHARINDEX

PATINDEX
,如上所示,但我还建议添加 
COALESCE
,以防您的 
@stringtoFind
 不包含在您的 
@stringhere
 中。

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

2
投票
我遇到了同样的问题,并做出了与 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'

解释是一样的


0
投票
要仅修改第一个字母,请添加

"WHEN CHARINDEX(@FindText, @Text) = 1"

如果没有,您将面临替换句子中不存在的另一个字母的风险。

DECLARE @Text varchar(MAX), @TextReplaceBy varchar(20), @FindText varchar(20); SET @Text = 'Text to replace'; SET @FindText = 't'; SET @TextReplaceBy = ''; SELECT CASE WHEN CHARINDEX(@FindText, @Text) = 1 THEN STUFF(@Text, CHARINDEX(@FindText, @Text), LEN(@FindText), @TextReplaceBy) ELSE @Text END
    

0
投票

https://www.dotnetiseasy.com/Artical/SQL/21/Replace%20string%20as%20camelCase%20in%20MSSQL

DROP TABLE IF EXISTS #YourTableName; CREATE TABLE #YourTableName (yourColumn VARCHAR(20)); INSERT INTO #YourTableName VALUES ('abcd_abcd_abcd'), ('dfredsdfsf'); ;WITH CTE AS ( SELECT ISNULL(STUFF(yourColumn, CHARINDEX('_', yourColumn), 2, UPPER(SUBSTRING(yourColumn, CHARINDEX('_', yourColumn) + 1, 1))), yourColumn) AS yourColumn, CHARINDEX('_', yourColumn) AS b, 0 AS num FROM #YourTableName a UNION ALL SELECT STUFF(yourColumn, CHARINDEX('_', yourColumn), 2, UPPER(SUBSTRING(yourColumn, CHARINDEX('_', yourColumn) + 1, 1))) AS a, CHARINDEX('_', yourColumn) AS b, num + 1 AS num FROM CTE a WHERE b > 0 ) SELECT * FROM CTE WHERE yourColumn IS NOT NULL AND CHARINDEX('_', yourColumn) = 0;
    
© www.soinside.com 2019 - 2024. All rights reserved.