برای این کار می توانید از تابع داخلی اوراکل با نام LISTAGG استفاده نمایید.
*فقط توجه داشته باشید که این تابع در نسخه 11 به بعد پشتیبانی می شود
WITH aux AS
(
SELECT 1 id,'a' letter FROM dual UNION
SELECT 1 id,'b' letter FROM dual UNION
SELECT 2 id,'c' letter FROM dual UNION
SELECT 5 id,'d' letter FROM dual UNION
SELECT 5 id,'e' letter FROM dual
)
SELECT
id , LISTAGG (letter,'-') WITHIN GROUP (ORDER BY id) string
FROM aux
group by id
ID
----------
STRING
--------------------------------------------------------------------------------
1
a-b
2
c
5
d-e
3 rows selected.
در نسخه 10 میتوان از XMLAGG استفاده کرد که البته یک مقدار از LISTAGG پیچیده تر است
WITH emp AS
(SELECT 1 deptno, 'Gholi' ename
FROM DUAL
UNION ALL
SELECT 1 deptno, 'Ahmad' ename
FROM DUAL
UNION ALL
SELECT 2 deptno, 'Mammad' ename
FROM DUAL)
SELECT deptno,
RTRIM (XMLAGG (XMLELEMENT (e, ename || ',')).EXTRACT ('//text()'),
','
) enames
FROM emp
GROUP BY deptno
DEPTNO
----------
ENAMES
--------------------------------------------------------------------------------
1
Gholi,Ahmad
2
Mammad
2 rows selected.