SQL (WITH AS 递归)把一条数据拆成多条数据

未处理之前表数据格式,如下图:

这张图只要看我划红线的两列就可以了,RoomID(会议室ID) 、AttendPerson(参会人员ID,多个以逗号分隔);

我遇到的问题是,根据用户ID查询某个用户,所有参会的记录,直接用LIKE是不行的,所以就用了以下方法如下:

	if exists (select * from tempdb.dbo.sysobjects where id = object_id(N'tempdb..#OA_Mettingresult') and type='U')
	drop table #OA_Mettingresult;

	WITH testtb2 AS 
				( SELECT ID, A.AttendPerson, CHARINDEX(',', A.AttendPerson + ',') AS STA, CHARINDEX(',', A.AttendPerson + ',') - 1 AS LENS
				   FROM tbt_MeetingInfo AS A UNION ALL
					SELECT ID, AttendPerson, CHARINDEX(',', AttendPerson + ',', STA + 1) AS STA, CHARINDEX(',', AttendPerson + ',', STA + 1) - STA - 1 AS LENS
					FROM testtb2 AS testtb2_2
					WHERE (STA <> 0)
				)
				SELECT * INTO #OA_Mettingresult FROM(SELECT ID as MeetingID,SUBSTRING(AttendPerson, STA - LENS, LENS) AS UserID
																							FROM testtb2
																							WHERE (STA <> 0)) as a

(讲解一下这段SQL:

第一、二行我就不说了,就是删除临时表的;

第五、六行中的SELECT语句查出第一个ID,要截取的长度和位置(如下图(一));

第七、八、九行SELECT就是递归出,剩下每个ID需要截取的长度和位置(如下图(二));

最后根据WITH AS得出的结果,按照每一行需要截取的长度和位置,进行SubString就搞定了(如下图(三));)

图(一) 

图(二) 

 这是最后处理的结果如下图(三):

 

 这里使用了WITH AS递归的方式,也是第一次用,所以想具体了解它的用法可以https://www.cnblogs.com/lsgsanxiao/p/5779527.html去这里看一下,也可以自行百度。 

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值