Oracle
 sql >> база данни >  >> RDS >> Oracle

Функция LISTAGG() в Oracle

В 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 за повече подробности какво можете да правите с тази функция.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Конфигурирайте Hibernate да използва SYS_GUID() на Oracle за първичен ключ

  2. Има ли най-добрият начин да избегнете изпълнението на процес повече от веднъж в Oracle?

  3. проблем при намирането на списък с файлове в директорията

  4. Как да форматирате отрицателни числа с ъглови скоби в Oracle

  5. ORA-06502:PL/SQL:числова или стойностна грешка:буферът за низ от знаци е твърде малък