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

Sådan bruger du Oracle LISTAGG-funktionen

Oracle LISTAGG-funktion er en analytisk funktion, som giver os mulighed for at sammenkæde strengene for measure_column for hver GROUP baseret på orden_efter_sætningen. Dette er til stede i Oracle fra 11gR2

Syntaksen for LISTAGG-funktionen i Oracle er

LISTAGG (målekolonne [, 'afgrænser'])
INDEN GRUPPE (order_by_clause) OVER (query_partition_clause)]

Forklaring af begreber

målekolonne Kolonnen eller det udtryk, hvis værdier du ønsker at sammenkæde i resultatsættet. Nulværdier i målekolonnen ignoreres.
Afgrænsning Valgfrit. Det er afgrænsningen, der skal bruges, når du adskiller målekolonnen værdier, når resultaterne udlæses.
order_by_clause Det bestemmer rækkefølgen, som de sammenkædede værdier returneres i

Lad os se nogle tilfælde og eksempler på LISTAGG-funktionen

1) Som en enkelt-sæt aggregeret funktion fungerer LISTAGG på alle rækker og returnerer en enkelt outputrække.

 

VÆLG LISTAGG(fornavn, '; ')
INDEN GRUPPEN (ORDRER EFTER ansættelsesdato, efternavn) "Medarbejderliste",
MIN(ansættelsesdato) "Tidligst"
FRA ansættelse
HVOR afd.nr. =30;

Employee_list                                                Tidligst
------------------------------------------------ ------------------ ----------
TOM; BIR; BILL                                            17-JUN-18

2) Som et gruppesæt-aggregat fungerer funktionen på og returnerer en outputrække for hver gruppe defineret af GROUP BY-sætningen.

KOLONNE medarbejdere FORMAT A50
VÆLG deptnr., LISTAGG(ename, ';') INDEN FOR GRUPPE (ORDER EFTER ename) SOM ansatte
FRA emp
GROUP BY deptnr;
DEPTNO MEDARBEJDERE
---------------- ------------------------------------------ ---------------
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BIR; REGNING

Flere eksempel

vælg tabelnavn,
listagg(indeksnavn, ',') i gruppen (rækkefølge efter indeksnavn) alle_inds
fra brugerindekser
grupper efter tabelnavn;

3)Som en analytisk funktion opdeler LISTAGG forespørgselsresultatsættet i grupper baseret på et eller flere udtryk i query_partition_clausen.

 

SQL> SELECT deptnr
, ename
, hiredate
, LISTAGG(ename, ',')
INDEN GRUPPE (ORDER BY hiredate)
OVER (OPDELING BY deptnr) AS-medarbejdere
FRA emp ordre af deptno;

DEPTNO ENAME ANSAT MEDARBEJDERE
---------------- ---------- ------------------ ----------- --------------------------
10 JOSHUA 09/06/2018 JOSHUA,KING,MILLER
10 KING 17/ 11/2018 JOSHUA,KING,MILLER
10 MILLER 23/01/2018 JOSHUA,KING,MILLER
20 AJAY 17/12/2018 AJAY,FANES,SCOTT,SMITH
20 FANES 04/2018 AJAY,FANES,SCOTT,SMITH
20 SCOTT 19/04/2018 AJAY,FANES,SCOTT,SMITH
20 SMITH 23/05/2018 AJAY,FANES,SCOTT,SMITH
30 TOM 20/02/2018 TOM; BIR; BILL
30 BIR 22/02/2018 TOM; BIR; BILL
30 BILL 01/05/2018 TOM; BIR; REGNING

Tilføjelse i LISTAGG-funktion fra Oracle-databasen 12cR2

Det maksimale antal tegn returnerer er 4000 bytes, og hvis det overstiger, giver det fejlen

ORA-01489:Resultatet af strengsammenkædning er for langt

Med Oracle 12cR2 har Oracle leveret en klausul om overløbsafkortning for at håndtere overløbsfejl elegant

 

listagg (
mål, ','
[ ved overløb (afkorte|fejl) ]
[ tekst ] [ (med|uden) tæller ]
) inden for gruppe (rækkefølge efter kolonner )

Nu kan du udtrykkeligt sige, om du vil have fejl- eller trunkeringssemantik. Pre 12cR2-koderne fungerer fint, da det er standardadfærden

Antag nu, at du ikke ønsker at returnere fejl, når den krydser 4k bytes, og derefter ved overløb afkortes er løsningen.

 

vælg tabelnavn,
listagg(indeksnavn, ',' ved overløb trunkere) inden for gruppe (rækkefølge efter indeksnavn) inds
fra brugerindekser
grupper efter tabelnavn;

I tilfælde af at der opstår trunkering, trunkerer Oracle til den næste fulde værdi, hvorefter du kan kontrollere, hvordan du fortæller brugeren, at listen er blevet trunkeret. Som standard tilføjer vi tre prikker '...' til strengen som indikator for, at trunkeringen er sket. Du kan ændre '….', hvis du vil, du kan tilsidesætte det

Hvis du vil erstatte "..." med "mere", "ekstra" eller et "klik for mere" hyperlink, skal du blot angive din nye streng!

 

vælg tabelnavn,
listagg(indeksnavn, ',' ved overløb truncate
'||'
) i gruppen (rækkefølge efter indeksnavn) inds
fra bruger_indekser
gruppe af tabelnavn;

Som standard viser truncate antallet af manglende værdier. Hvis du ikke ønsker at vise antallet, så brug uden optælling

 

vælg tabelnavn,
listagg(indeksnavn, ',' ved overløb, afkort '...' uden optælling) inden for gruppe (rækkefølge efter indeksnavn) inds
fra brugerindekser
grupper efter tabelnavn;

Pre 11GR2 opløsning (10g, 9i, 11gR1)

Hvis du ikke kører 11g Release 2 eller nyere, men kører en version af databasen, hvor WM_CONCAT-funktionen er til stede, så er det en nul-anstrengelsesløsning, da den udfører aggregeringen for dig. Det er faktisk et eksempel på en brugerdefineret aggregeret funktion beskrevet nedenfor, men Oracle har gjort alt arbejdet for dig.

KOLUMNE medarbejdere FORMAT A50
VÆLG deptnr, wm_concat(ename) AS medarbejdere
FRA ansat
GROUP BY deptnr;
EPTNO MEDARBEJDERE
------ ---------------------------------------------------- ----
10 JOSHUA,KING,MILLER
20 AJAY,FANES,SCOTT,SMITH
30 TOM; BIR; REGNING

Dette kan også opnås gennem brugerdefineret funktion. Jeg vil anbefale at tjekke nedenstående asktom-link. Dette skal læses

Listagg alternativ mulighed

Jeg håber, du kan lide indholdet af dette indlæg på Oracle LISTAGG Function

Relaterede artikler
Automatisk stigningskolonne – Sekvens som standardværdi i Oracle og mysql
Oracle Joins
Sql Set Operators
Sådan bruges google translate URL i Oracle plsql
Enkeltrækkefunktioner i sql
datofunktion i oracle

  1. Uordnede resultater i SQL

  2. SQL Fiddle-outputfejl

  3. Hvordan indsætter man pandas dataramme via mysqldb i databasen?

  4. Hvordan overvåger man SQL Server-tabelændringer ved hjælp af c#?