0

Suppose I have a table my_table that has the following structure:

id::int   counts::array
--------------------
02        {0,0,0,0,0,0,0}
03        {10,0,0,20,40,10,0}
04        {0,0,0,0,0,0,0}
05        {0,20,30,20,0,10,10}
06        {0,0,0,27,0,50,4}
07        {1,0,0,0,0,0,0}
08        {0,0,0,0,0,0,0}

I would like to run the following query, presented in pseudo code:

SELECT id, counts FROM my_table
WHERE NOT SUM(ARRAY_TO_STRING(counts, ', ')::int) = 0

I know I cannot use aggregate functions in a where clause, but what would be the quickest way to do this in PSQL?

1 Answer 1

3

You need to turn all elements of the array into rows to be able to sum them:

select mt.id, mt.counts
from my_table mt
where (select sum(i) from unnest(mt.counts) as t(i)) <> 0;

You could create function to make that easier:

create function int_array_sum(p_array int[])
  returns bigint
as
$$
   select sum(i) from unnest(p_array) as t(i);
$$
language sql;

Then you can use:

select mt.id, mt.counts
from my_table mt
where int_array_sum(mt.counts) <> 0;
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.