I have a Oracle 11g XE database and I have a query the result set:
ID Category
1 Cat1
1 Cat2
2 Cat3
2 Cat4
I want to get distinct id's with all related categories in same row as comma separated like this
ID Categories
1 Cat1,Cat2
2 Cat3,Cat4
I was using Postgres before and array_agg
helped me there. How can I get same result in Oracle 11g XE?
Unless you are using it in a stored procedure to save the output as an array(or collection), a query with
LISTAGG
should be sufficient and gives the same output.In oracle, we do not have have a straightforward conversion function like
array_agg
. However, you can create a user-defined collection type, then useCAST
andCOLLECT
functions to convert it to aNESTED TABLE
to get the same desired output.Firstly, create a collection
TYPE
.Now, running this query is equivalent to using
string_agg
orLISTAGG
, althoughcategories
is an array or collection, rather than a string.DEMO
Oracle has a function
listagg()
which is pretty close to Postgres'sstring_agg()
. Both seem to do what you want to do.However,
array_agg()
creates an array using a SQL expression. I don't think Oracle supports arrays as native types in SQL statements (although arrays are part of PL/SQL). Hence there is no equivalent.