未处理之前表数据格式,如下图:
这张图只要看我划红线的两列就可以了,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去这里看一下,也可以自行百度。