请教sql server中replace时如果跳过一些标签?

e哥 2017-12-09 06:13:22
请教sql server中replace时如果跳过一些标签?
比如5515,1,<t>宝贝,想你了哦,最近一直很难过</t>,<t>快乐点,没有忧愁</t>
在replace时跳过t标签中的内容?

declare @v nvarchar(999)='5515,1,<t>宝贝,想你了哦,最近一直很难过</t>,<t>快乐点,没有忧愁</t>';
declare @s int=charindex('<t>',@v);
--declare @r nvarchar(999)=stuff(@v,@s,charindex('</t>',@v)-@s+4,'aaa');
set @v=''''+replace(@v,',',''',''')+''''--用逗号分割传入的参数@v
--set @r=stuff(@r,
print @v
--想得到结果的是:'5515','1','宝贝,想你了哦,最近一直很难过','快乐点,没有忧愁'
...全文
236 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
e哥 2017-12-18
  • 打赏
  • 举报
回复
好,谢谢各位了
吉普赛的歌 2017-12-11
  • 打赏
  • 举报
回复
html 比 xml 复杂, 标签不止 <t></t> 一种, 而且可能存在标签不封闭的情况, 比如: <br> 建议按我#1处理就是了
道素 2017-12-11
  • 打赏
  • 举报
回复
用XML 方法


declare @v nvarchar(999)=N'5515,1,<t>宝贝,想你了哦,最近一直很难过</t>,<t>快乐点,没有忧愁</t>aaaaa,kkkkk';
SET @v='<t str="'+REPLACE(REPLACE(@v,',<t>','"/><t>'),'</t>','</t><t str="')+'"/>'
SELECT STUFF((
   SELECT ''','''+a.p FROM (VALUES(CONVERT(XML,'<n>'+@v+'</n>')))c(x) 
    OUTER APPLY (SELECT ISNULL(REPLACE(x.n.value('@str','nvarchar(max)'),',',''','''),'') +x.n.value('.','nvarchar(max)') AS p FROM c.x.nodes('n/t') x(n)) AS a
    WHERE LEN(a.p)>0
FOR XML PATH('') 
),1,2,'')+''''



'5515','1','宝贝,想你了哦,最近一直很难过','快乐点,没有忧愁','aaaaa','kkkkk'
二月十六 版主 2017-12-11
  • 打赏
  • 举报
回复
CREATE FUNCTION fun_replace
(
@str nvarchar(max) --源字符串
)
RETURNS NVARCHAR(MAX)
AS
BEGIN

DECLARE @ReturnText nvarchar(max)='';


WHILE(CHARINDEX('<t>',@str)>0)
BEGIN
SET @ReturnText=@ReturnText+replace(SUBSTRING(@str,0,CHARINDEX('<t>',@str)),',',''',''')
SET @ReturnText=@ReturnText+SUBSTRING(@str,CHARINDEX('<t>',@str)+3,CHARINDEX('</t>',@str)-CHARINDEX('<t>',@str)-3)
SET @str=STUFF(@str,1,CHARINDEX('</t>',@str)+3,'')
END
RETURN @ReturnText;
END
GO


declare @v nvarchar(999)='5515,1,<t>宝贝,想你了哦,最近一直很难过</t>,<t>快乐点,没有忧愁</t>';
declare @s int=charindex('<t>',@v);
set @v=''''+dbo.fun_replace(@v)+''''
print @v


xiaoxiangqing 2017-12-10
  • 打赏
  • 举报
回复
复杂的功能,用正则表达式好一些
吉普赛的歌 2017-12-09
  • 打赏
  • 举报
回复
IF OBJECT_ID('dbo.Fun_ReplaceTag') IS NOT NULL 
	DROP FUNCTION dbo.Fun_ReplaceTag 
GO
-- =============================================
-- Author:		yenange
-- Create date: 2017-12-09
-- Description:	替换字符串中的标签
-- =============================================
CREATE FUNCTION dbo.Fun_ReplaceTag 
(
	@s NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN
	DECLARE @r NVARCHAR(MAX),@singleChar NCHAR(1),@flag BIT 
	SET @s=ISNULL(@s,'')
	SET @r=''
	SET @flag=0
	
	WHILE len(@s)>0
	BEGIN
		SET @singleChar=LEFT(@s,1)
		SET @s=SUBSTRING(@s,2,len(@s)-1)
		IF @singleChar='<'
		BEGIN
			SET @flag=1
		END
		
		IF @flag=0
		BEGIN
			SET @r=@r+@singleChar
		END
		
		IF @singleChar='>'
		BEGIN
			SET @flag=0
		END
	END
	
	
	RETURN @r;
END
GO
declare @v nvarchar(999)
SET @v='5515,1,<t>宝贝,想你了哦,最近一直很难过</t>,<t>快乐点,没有忧愁</t>';

PRINT dbo.Fun_ReplaceTag(@v)
/*
5515,1,宝贝,想你了哦,最近一直很难过,快乐点,没有忧愁
*/
效率最高的办法, 是写 sqlclr 函数, 用正则替换的方法来完成, 但要花的功夫也不少了。 如果要求不高就按上面吧。

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧