12

Having problems when using array_agg when a row contains an empty array ({}).

This is my SQL query:

SELECT service_name, metric_name, array_agg(value_textarray)
FROM service_data
WHERE service_name = 'ActivityDataService'
GROUP BY service_name, metric_name

Where the column definitions are the following:

service_name - text
metric_name - text
value_textarray - text[]

When I execute the query and I have empty array ({}) in the database, I get the following error:

ERROR:  cannot accumulate empty arrays

How should I go about fixing this?

3
  • 2
    Simply add "and array <> empty" to the WHERE clause?
    – jarlh
    Apr 18, 2017 at 12:46
  • 2
    Indeed. AND value_textarray <> '{}' took the cake. Thanks.
    – Tarps
    Apr 18, 2017 at 12:49
  • 2
    Alternatively: and coalesce(cardinality(value_textarray),0) = 0 Apr 18, 2017 at 14:20

1 Answer 1

16

I had the same issue where I couldn't filter the empty array and I found this function. This function avoids the 'accumulating empty arrays' error.

CREATE AGGREGATE array_accum (anyarray)
(
    sfunc = array_cat,
    stype = anyarray,
    initcond = '{}'
);  

source: https://gist.github.com/ryandotsmith/4602274

1
  • This works and can probably be customized to allow concatenation null arrays.
    – richddr
    Nov 20, 2019 at 19:42

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.