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 artiklerAutomatisk 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