Oracle
 sql >> Base de données >  >> RDS >> Oracle

obtenir des noms à partir d'identifiants séparés par des virgules dans SQL

Pour ce faire, joignez une table avec des nombres entiers, de sorte que chaque ligne d'employé se produise aussi souvent qu'il y a d'ID de service dans sa chaîne, mais au moins une fois. Pour les lignes du résultat de la jointure, les nombres i passer de 1 à n , où n est le nombre d'ID dans la chaîne pour cet employé (s'il existe des ID de service pour l'employé). Ensuite, vous pouvez utiliser REGEXP_SUBSTR() pour obtenir le _i_ème nombre de la chaîne. Utilisez-le pour joindre à gauche les départements, pour obtenir le nom du département. Utilisez ensuite une agrégation en utilisant LISTAGG() pour obtenir à nouveau une seule ligne pour chaque employé.

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<>violon