در برخی از سناریوها نیاز به نمایش خروجی چند مقدار به صورت یک مقدار با یک جداکننده مانند کاما داریم. در Oracle میتوان از تابع LISTAGG برای تبدیل نتایج پرسوجو به صورت یک مقدار جداشده با کاما استفاده نمود.
به طور مثال پرسوجوی زیر نام قارهها را از جدول regions باز میگرداند.
1SELECT region_name
2FROM regions;
نتیجه:
1REGION_NAME
2------------------------
3Americas
4Asia
5Middle East and Africa
این پرسوجو چهار سطر مختلف به عنوان نتیجه را باز میگرداند. اما اگر بخواهیم این چهار سطر را به صورت یک مقدار جدا شده با کاما نمایش دهیم میتوانیم آن را به صورت زیر انجام دهیم:
1SELECT LISTAGG(region_name, ', ')
2FROM regions;
نتیجه:
1LISTAGG(LAST_NAME,',')
2-----------------------------------------------
3Europe, Americas, Asia, Middle East and Africa
تابع LISTAGG دو مقدار را به عنوان ورودی دریافت مینماید. مقدار اول نام ستون و مقدار دوم جدا کننده مورد نظر میباشد که در این مثال کاراکتر کاما است. مقدار دوم اختیاری است و اگر داده نشود بدون جدا کننده مقادیر بهم چسبانده میشوند.
امکان استفاده از عبارت DISTINCT در تابع LISTAGG به منظور حذف مقادیر تکراری نیز وجود دارد.
1SELECT LISTAGG(DISTINCT region_id, ',')
2FROM countries
نتیجه:
1LISTAGG(DISTINCT region_id, ',')
2--------------------------------------------
31,2,3,4
به منظور مرتب سازی نتایج در تابع LISTAGG میتوان از عبارت WITHIN GROUP (ORDER BY…) استفاده نمود.
1SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
2FROM regions;
نتیجه:
1LISTAGG(region_name, ',')
2--------------------------------------------
3Americas,Asia,Europe,Middle East and Africa
از تابع LISTAGG می توان در یک پرسوجو گروهبندی شده نیز استفاده نمود.
1SELECT
2 region_id,
3 LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
4FROM countries
5GROUP BY region_id
6ORDER BY region_id;
نتیجه:
1REGION_ID Countries
2------------------------------------------------
31 BE, CH, DE, DK, FR, IT, NL, UK
42 AR, BR, CA, MX, US
53 AU, CN, HK, IN, JP, SG
64 EG, IL, KW, NG, ZM, ZW