В Oracle, LISTAGG()
функцията ни позволява да комбинираме данни от множество редове в един ред.
Имаме възможност да посочим разделител (като запетая). Можем също да поръчаме резултатите, произведени от LISTAGG()
функция и др.
Синтаксис
Синтаксисът е така:
LISTAGG( [ ALL | DISTINCT ] measure_expr [, 'delimiter'] [listagg_overflow_clause] )
[ WITHIN GROUP order_by_clause ] [OVER query_partition_clause]
Където listagg_overflow_clause
е:
{ ON OVERFLOW ERROR }
|
{ ON OVERFLOW TRUNCATE [ 'truncation-indicator' ] [ { WITH | WITHOUT } COUNT ] }
Пример
Да предположим, че изпълняваме следната заявка:
SELECT region_name
FROM regions;
Резултат:
REGION_NAME _________________________ Europe Americas Asia Middle East and Africa
Можем да използваме LISTAGG()
за да конвертирате тези резултати в списък, разделен със запетая:
SELECT LISTAGG(region_name, ', ')
FROM regions;
Резултат:
LISTAGG(REGION_NAME,',') _________________________________________________ Europe, Americas, Asia, Middle East and Africa
Променете разделителя
Можем да променим втория аргумент на различен разделител:
SELECT LISTAGG(region_name, '; ')
FROM regions;
Резултат:
Europe; Americas; Asia; Middle East and Africa
Пропуснете разделителя
Можем да пропуснем втория аргумент, за да имаме конкатенирана всяка стойност без разделител:
SELECT LISTAGG(region_name)
FROM regions;
Резултат:
EuropeAmericasAsiaMiddle East and Africa
Поръчайте резултатите
Можем да използваме WITHIN GROUP (ORDER BY...)
клауза за подреждане на изхода на LISTAGG()
функция:
SELECT LISTAGG(region_name, ',') WITHIN GROUP (ORDER BY region_name ASC)
FROM regions;
Резултат:
Americas,Asia,Europe,Middle East and Africa
Използване в групирани заявки
Можем да използваме LISTAGG()
функция в рамките на групирана заявка, за да предостави резултати като този:
SELECT
region_id,
LISTAGG(country_id, ', ') WITHIN GROUP (ORDER BY country_id ASC) AS "Countries"
FROM countries
GROUP BY region_id
ORDER BY region_id;
Резултат:
REGION_ID Countries ____________ _________________________________ 1 BE, CH, DE, DK, FR, IT, NL, UK 2 AR, BR, CA, MX, US 3 AU, CN, HK, IN, JP, SG 4 EG, IL, KW, NG, ZM, ZW
Връщане само на отделни стойности
Можем да използваме DISTINCT
клауза за връщане само на уникални стойности:
SELECT LISTAGG(DISTINCT region_id, ', ')
FROM regions;
Резултат:
1, 2, 3, 4
Вижте документацията на Oracle за повече подробности какво можете да правите с тази функция.