SqlServer中,并不直接支持字符串的正则表达式操作,一些特殊的字符串操作需求需要分多个步骤来完成。
有时候,我们会碰到仅需要替换字符串中某个文本第一次出现的内容,此时无法直接用replace来完成,可以分解为以下两个步骤:
1)找出文本在字符串的第一次出现的位置,使用 charindex 函数可完成;
2)替换从找到的位置开始,长度为搜索文本长度范围的字符串,stuff 函数可以实现。
写成函数即如下:
CREATE FUNCTION dbo.ReplaceFirst ( @source nvarchar(max), @find nvarchar(1000), @repl nvarchar(1000) ) RETURNS nvarchar(max) AS BEGIN DECLARE @ResultVar nvarchar(max) -- return value DECLARE @Pos int -- find the first position set @Pos = CHARINDEX(@find, @source) -- not found, return orginal if @Pos = 0 return @source set @ResultVar = stuff(@source, @Pos, len(@find), @repl) -- Return the result of the function RETURN @ResultVar END GO
举例,如下字符吕,希望把第一个div块标签去掉:
'<div>我不需要块元素</div><div>我是块一</div><div>我是块二</div>'
可以调用:
select dbo.replaceFirst( dbo.replaceFirst('<div>我不需要块元素</div><div>我是块一</div><div>我是块二</div>', '<div>', '' ), '</div>', '' )
结果为:‘我不需要块元素<div>我是块一</div><div>我是块二</div>’