我有一个应用程序,用户可以在其中创建组,然后为每个组指定条件。目前我将条件作为类型/字段/值列存储在一个单独的表中,并从中生成WHERE
子句(在我的应用程序代码中)。我可以改为创建数据库视图或函数。
用户可以选择的条件的一些示例(在哪里?是用户定义的):
field1 > ?
field2 ILIKE '?%'
现在我想为几个这样的组(每个组具有不同的条件)获得count(distinct id)
个匹配的行。单个行可能匹配多个组,在这种情况下,它应该计入所有组。
有没有办法在单个查询中执行此操作,可能使用视图(但不是物化视图)或pl / pgSQL(如果符合条件,则检查每一行,考虑到它可以匹配多个组的条件)? CASE
可能在这里工作吗?每行可能匹配多个组的事实似乎是有问题的。如有必要,我可以修改数据库架构。
在特定情况下,所有组将匹配来自表的特定子集的行(即WHERE user_id = X)。所以我想要的是在一次传递中遍历所有这些行,并确定每个行匹配哪些组(可能是多个)。
到目前为止我能够做到的最好的是为所有组生成查询,然后UNION
- 将它们放在一起,这样我就不需要多次往返DB了。是否有更高效的解决方案,或者这是我在这种情况下能做的最好的解决方案?基本上我想避免N + 1查询只是为了得到计数。
答案 0 :(得分:1)
你可能需要filter
in aggregate expression,这是Postgres 9.4中引入的一项功能。例如:
drop table example;
create table example (id int, col1 text, col2 text, qty int);
insert into example values
(1, 'a', 'b', 1),
(2, 'a', 'a', 10),
(3, 'a', 'c', 11);
select
count(distinct id) filter (where col1 ilike 'a%') cond1,
count(distinct id) filter (where col2 = col1) cond2,
count(distinct id) filter (where qty = any (array[1, 2, 3])) cond3
from
example;
cond1 | cond2 | cond3
-------+-------+-------
3 | 1 | 1
(1 row)