我想要的是计算对应于真(出勤),假(非出席)和任何单个事件的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,并试图谷歌“计算数组”并没有发现任何有用的东西。
我如何计算单个事件的不同值?
答案 0 :(得分:3)
您可以在SELECT中使用unnest
,如下所示:
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 :(得分:1)
您可以对array_length函数结果进行求和:
SELECT SUM(array_length(userconfirm, 2)) WHERE id = 6;
答案 2 :(得分:0)
这个可以做到这一点(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=#