sqlserver 一个字段的数据用逗号隔开 字段中的数据去重

废话不多说,直接来贴代码,被这问题困扰了一天,后来网上看到别人写的给了我灵感,自己改造了一个更容易理解的方法。希望对大家有所帮助。(最后悄悄告诉大家我发现的一个新大陆,group by 可以去重

亲测有效哦

USE XXX
--将符号拼接的字段数据转换成table
if exists(select * from sysobjects where id=OBJECT_ID('F3_SplitStr'))
drop function F3_SplitStr
GO

Create   FUNCTION  [dbo].[F3_SplitStr]
(
	@SplitValue VARCHAR(MAX),
	@Separate VARCHAR(100)
)  
RETURNS  @ReturnTable TABLE(RealValue VARCHAR(MAX))  
AS  
BEGIN  
	DECLARE  @SplitStr   VARCHAR(MAX)  
	DECLARE  @SepIndex   BIGINT  
	DECLARE  @LastSepIndex  BIGINT  

	/* 当分隔符长度为0,直接返回包含一条记录,且内容为@SplitValue的表结果 */
	IF LEN(@Separate)=0
	BEGIN
		INSERT INTO @ReturnTable Values(@SplitValue)  
		RETURN
	END


	SET   @LastSepIndex   =   0  

	IF   Right(@SplitValue ,len(@Separate)) <> @Separate 
	BEGIN 
		SET  @SplitValue = @SplitValue+@Separate  
	END
	SET   @SepIndex  =  CharIndex(@Separate,@SplitValue ,@LastSepIndex)  

	WHILE   @LastSepIndex <=  @SepIndex  
	BEGIN  
		SET   @SplitStr   =   SubString(@SplitValue,@LastSepIndex,@SepIndex-@LastSepIndex)  
		SET   @LastSepIndex   =   @SepIndex   +   LEN(@Separate)
		SET   @SepIndex   =   CharIndex(@Separate,@SplitValue,@LastSepIndex)  
		INSERT INTO   @ReturnTable   Values(@SplitStr)  
	END  
	RETURN  
END   



 

USE XXX
GO
DECLARE @TableInfo TABLE(Numbers INT ,Name VARCHAR(MAX))

INSERT INTO @TableInfo (Numbers,Name) VALUES('1','张三,李四,王五,赵柳,王五')
INSERT INTO @TableInfo (Numbers,Name) VALUES('2','allie,lisa,jonne,lily,lily')
--输出处理前的表
SELECT * FROM @TableInfo

--整理数据,给需要的数据加序号,以便于后面循环修改数据
DECLARE @TableInfos TABLE(RowNumber INT,Numbers INT ,Name VARCHAR(MAX))

INSERT INTO @TableInfos
SELECT ROW_NUMBER() OVER(ORDER BY Numbers), * FROM @TableInfo
 
--2.循环更新每一行
DECLARE @i INT,@iMax INT,@Name VARCHAR(MAX)
SELECT @i= ISNULL(MIN(RowNumber),1) ,@iMax = ISNULL(max(RowNumber),0) FROM @TableInfos
WHILE @i<=@iMax 
BEGIN
    SELECT  @Name=Name FROM @TableInfos WHERE RowNumber = @i
     
    UPDATE @TableInfos SET Name=
        (SELECT STUFF(
            (
				SELECT ','+ RealValue FROM F3_SplitStr(@Name,',') GROUP BY RealValue
                FOR XML PATH('')
            ),1,1,''))
        WHERE RowNumber =@i
     
    SET @i=@i+1
END
--输出处理过的表
SELECT * FROM @TableInfos

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值