我必须从 @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'
。
%
select STUFF(@stringhere, PATINDEX('%' + @stringtofind + '%', @stringhere), LEN(@stringtofind), ' ')
CHARINDEX
或
PATINDEX
,如上所示,但我还建议添加
COALESCE
,以防您的
@stringtoFind
不包含在您的
@stringhere
中。
SELECT COALESCE(STUFF(@stringhere, PATINDEX('%' + @stringtofind + '%', @stringhere), LEN(@stringtofind), ' '), @stringhere)
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'
解释是一样的
"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
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;