Oracle
 sql >> Database >  >> RDS >> Oracle

ottenere nomi da ID separati da virgole in SQL

Per fare ciò, unisciti a una tabella con numeri interi, in modo che ogni riga di dipendente si verifichi ogni volta che ci sono ID reparto nella sua stringa ma almeno una volta. Per le righe nel join risultano i numeri i vai da 1 a n , dove n è il numero di ID nella stringa per quel dipendente (se sono presenti ID reparto per il dipendente). Quindi puoi utilizzare REGEXP_SUBSTR() per ottenere il _i_esimo numero dalla stringa. Usalo per unirti a sinistra ai dipartimenti, per ottenere il nome del dipartimento. Quindi usa un'aggregazione usando LISTAGG() per ottenere nuovamente una singola riga per ogni dipendente.

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