2017-12-17 23 views
1

Ich habe eine 11g XE Oracle-Datenbank und ich habe eine Abfrage, um die Ergebnismenge:Equivalent von array_agg PostgreSQL in Oracle XE 11.2

ID Category 
1 Cat1 
1 Cat2 
2 Cat3 
2 Cat4 

ich verschiedene IDs mit allen verbundenen Kategorien in derselben Zeile wie Komma erhalten möge getrennt wie diese

ID Categories 
1 Cat1,Cat2 
2 Cat3,Cat4 

wurde ich Postgres vor der Verwendung und array_agg half mir dort. Wie kann ich dasselbe Ergebnis in Oracle 11g XE erhalten?

+0

tl; dr - 'LISTAGG()' wurde in 11g hinzugefügt und das Ergebnis geben setzen Sie benötigen. – Ben

Antwort

2

Sofern Sie es nicht in einer gespeicherten Prozedur verwenden, um die Ausgabe als Array (oder Sammlung) zu speichern, sollte eine Abfrage mit LISTAGG ausreichen und die gleiche Ausgabe ergeben.

select ID , LISTAGG(Category,',') WITHIN GROUP (ORDER BY ID) Categories 
FROM yourtable GROUP BY ID; 

in Oracle, haben wir nicht haben, eine einfache Konvertierungsfunktion wie array_agg. Sie können jedoch einen benutzerdefinierten Sammlertyp erstellen und dann die Funktionen CAST und COLLECT verwenden, um sie in einen NESTED TABLE zu konvertieren, um dieselbe gewünschte Ausgabe zu erhalten.

Zuerst erstellen Sie eine Sammlung TYPE.

create or replace TYPE categorytype as TABLE OF VARCHAR2(20); 

Nun ist diese Abfrage ausgeführt wird äquivalent string_agg oder LISTAGG zu verwenden, obwohl categories ein Array oder Sammlung, anstatt einen String.

select id, CAST (COLLECT(Category) as categorytype) categories 
FROM yourtable group by id; 

| ID | CATEGORIES | 
|----|------------| 
| 1 | Cat1,Cat2 | 
| 2 | Cat3,Cat4 | 

DEMO

+0

Vielen Dank Kumpel. Dein Vorschlag hat für mich funktioniert. – Murmelto

+0

Ich habe unten zwei Datensätze in die Tabelle eingefügt: INTO yurntable (ID, Kategorie) WERTE (2, 'Cat4') INTO yurtable (ID, Kategorie) VALUES (2, 'Cat4') wenn ich listagg query i verwende Habe 2 Cat3, Cat4, Cat4i, Cat4 Ergebnisse bekommen. Wie kann ich Werte in Listagg duplizieren? – Murmelto

0

Oracle hat eine Funktion listagg(), die ziemlich nah an Postgres string_agg() ist. Beide scheinen zu tun, was Sie tun wollen.

Allerdings erstellt array_agg() ein Array mit einem SQL-Ausdruck. Ich glaube nicht, dass Oracle Arrays als native Typen in SQL-Anweisungen unterstützt (obwohl Arrays Teil von PL/SQL sind). Daher gibt es kein Äquivalent.