SQL(WITHAS函数调用)把一条信息拆成多张图片

原创
小哥 3年前 (2022-11-16) 阅读数 35 #大杂烩

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

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

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

    if exists (select * from tempdb.dbo.sysobjects where id = object_id(Ntempdb..#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 去这里看一下,也可以自行百度。

版权声明

所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除

热门