PostgreSQL подсчитывает значения массива - PullRequest
5 голосов
/ 04 февраля 2012

Я хотел бы посчитать элементы массива, которые соответствуют true (посещаемость), false (отсутствие посещаемости) и NULL для любого отдельного события.

РЕДАКТИРОВАТЬ:

Я простоЯ понял, что массивы не ведут себя так, как я думал в pSQL, поэтому простого

userconfirm bool[]

может быть достаточно.Тем не менее, у меня все еще есть проблема с подсчетом значений true / false / null.Я попытаюсь изменить вопрос ниже, чтобы соответствовать этому новому ограничению.Я прошу прощения за любые ошибки.


У меня есть столбец, такой как

userconfirm bool[]

Где userconfirm[314] = true будет означать, что пользователь # 314 будет присутствовать.(false = нет посещений, NULL = не читается и т. д.).

Я не уверен, что это лучшее решение для этой функции (пользователи объявляют о своем посещении мероприятия), но у меня возникли проблемы сагрегатная функция в этом столбце.

select count(*) from foo where id = 6 AND true = ANY (userconfirm);

Это возвращает только 1, и попытка "подсчета массивов" в Google не дает ничего полезного.

Как бы я посчитал различные значениядля одного мероприятия?

Ответы [ 3 ]

3 голосов
/ 05 февраля 2012

Вы можете использовать unnest в своем SELECT следующим образом:

select whatever,
       (select sum(case b when 't' then 1 else 0 end) from unnest(userconfirm) as dt(b))
from your_table
-- ...

Например, если это:

=> select * from bools;
 id |     bits     
----+--------------
  1 | {t,t,f}
  2 | {t,f}
  3 | {f,f}
  4 | {t,t,t}
  5 | {f,t,t,NULL}

Вы получите это:

=> select id, (select sum(case b when 't' then 1 else 0 end) from unnest(bits) as dt(b)) as trues from bools;
 id | trues 
----+-------
  1 |     2
  2 |     1
  3 |     0
  4 |     3
  5 |     2

Если это слишком некрасиво, вы можете написать функцию:

create function count_trues_in(boolean[]) returns bigint as $$
    select sum(case b when 't' then 1 else 0 end)
    from unnest($1) as dt(b)
$$ language sql;

и использовать ее для точного оформления запроса:

=> select id, count_trues_in(bits) as trues from bools;
 id | trues 
----+-------
  1 |     2
  2 |     1
  3 |     0
  4 |     3
  5 |     2
1 голос
/ 04 февраля 2012

Вы можете СУММИТЬ результат функции array_length:

SELECT SUM(array_length(userconfirm, 2)) WHERE id = 6;
0 голосов
/ 05 февраля 2012

Этот может сделать трюк ( unnest ).

postgres=# with y(res) as (
postgres(#              with x(a) as (
postgres(#                      values (ARRAY[true,true,false])
postgres(#                      union all
postgres(#                      values (ARRAY[true,null,false])
postgres(#              )
postgres(#              select unnest(a) as res
postgres(#              from x
postgres(#      )
postgres-# select count(*)
postgres-# from y
postgres-# where res;
 count
-------
     3
(1 row)


postgres=#
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...