I have a column which is of type integer array. How can I merge all of them into a single integer array?
For example: If I execute query:
select column_name from table_name   I get result set as:
-[RECORD 1]---------- column_name | {1,2,3} -[RECORD 2]---------- column_name | {4,5}   How can I get {1,2,3,4,5} as final result?
PostgreSQL UNNEST() function This function is used to expand an array to a set of rows.
PostgreSQL ARRAY_AGG() function is an aggregate function that accepts a set of values and returns an array where each value in the input set is assigned to an element of the array. Syntax: ARRAY_AGG(expression [ORDER BY [sort_expression {ASC | DESC}], [...]) The ORDER BY clause is an voluntary clause.
You could use unnest to open up the arrays and then array_agg to put them back together:
select array_agg(c) from (   select unnest(column_name)   from table_name ) as dt(c); 
                        Define a trivial custom aggregate:
CREATE AGGREGATE array_cat_agg(anyarray) (   SFUNC=array_cat,   STYPE=anyarray );  and use it:
WITH v(a) AS ( VALUES (ARRAY[1,2,3]), (ARRAY[4,5,6,7])) SELECT array_cat_agg(a) FROM v;  If you want a particular order, put it within the aggregate call, i.e. array_cat_agg(a ORDER BY ...)
This is roughly  O(n log n) for n rows (I think)O(n²) so it is unsuitable for long sets of rows. For better performance you'd need to write it in C, where you can use the more efficient (but horrible to use) C API for PostgreSQL arrays to avoid re-copying the array each iteration.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With