从SQL中以逗号分隔的ID中获取名称

时间:2018-08-20 12:08:49

标签: sql oracle split

我在Oracle中有这种表

empid name deptid
1      a    1,2
2      b
3      c    1,2,3

我的部门表如下,

Deptid DeptName
 1      IT
 2      Finance
 3      HR

我希望在select语句中得到这样的结果

empid name dept
1     a    IT,Finance
2     b
3     c    IT,Finance,HR

两个表中都有1000多个行,我是pl \ sql的初学者,不知道该怎么做,请帮忙。

1 个答案:

答案 0 :(得分:0)

为此,将一个表与整数连接起来,以便每个员工行的出现频率与其字符串中的部门ID一样,但至少出现一次。对于联接结果中的行,数字 i 从1到 n ,其中 n 是该员工字符串中ID的数量(如果该员工有任何部门ID)。然后,您可以使用REGEXP_SUBSTR()从字符串中获取第_i_th个数字。使用它离开部门,以获取部门名称。然后使用LISTAGG()进行汇总,以再次为每位员工获得一行。

SELECT E.EMPID,
       E.NAME,
       E.DEPTID,
       LISTAGG(D.DEPTNAME, ',') WITHIN GROUP (ORDER BY I.I) DEPTNAME
       FROM EMPLOYEE E
            LEFT JOIN (SELECT ROW_NUMBER() OVER (ORDER BY DEPTID) I
                              FROM DEPARTMENT) I
                      ON I.I <= REGEXP_COUNT(E.DEPTID, ',') + 1
            LEFT JOIN DEPARTMENT D
                      ON D.DEPTID = TO_NUMBER(REPLACE(REGEXP_SUBSTR(',' || E.DEPTID, ',([[:digit:]]+)', 1, I.I), ',', ''))
       GROUP BY E.EMPID,
                E.NAME,
                E.DEPTID;

db<>fiddle