我有一个名为'apple'的表,我写了以下查询:
select name,
count(name),
case when istasty is null then false else istasty end
from apple
group by name, istasty;
这是输出:
我正在尝试使用以下条件对name
和istasty
标记进行分组:
tala
同时包含true
和false
istasty
列。但是,我想返回false,因为它至少有一个错误的istasty
列。 istasty
列进行分组后true
,则返回true
;同样,如果所有istasty
列都为false
,则返回该特定名称列的false
。通过编写查询,我可以在bool_and
中使用postgresql
运算符:
select name, count(name), bool_and(coalesce(istasty = true, false)) from apple group by name;
有没有办法可以修改我的第一个查询,以便在having clause
中添加过滤器以获得与在第二个查询中使用bool_and
运算符相同的结果?或者还有其他可行的方法吗?
请注意我没有使用bool_and
运营商。我很感激你的时间。谢谢。
答案 0 :(得分:0)
使用bool_and
运算符的替代方法是常规条件聚合:
SELECT
name,
COUNT(*) AS count,
CASE WHEN SUM(CASE WHEN !istasty THEN 1 ELSE 0 END) > 0
THEN FALSE ELSE TRUE END AS result
FROM apple
GROUP BY name;
当您建议使用HAVING
子句时,我不确定您的想法。通过将条件检查移动到HAVING
子句,您可以在符合条件的查询中排除/包含特定组。
答案 1 :(得分:0)
您的逻辑(仅当所有值都为真时返回true)等同于获取min()
布尔值:
select
name,
min(istasty::varchar(5))::boolean
from (select name, case when istasty is null then false else istasty end istasty
from apple
group by name, istasty) x
group by name
请注意,postgres不支持聚合boolean
值,因此您必须转换为字符然后返回布尔值以使用min()
。