在Postgresql中,分组后,如果列的任何值为false,则返回false。如果所有值都为真/假,则分别返回true / false

时间:2018-02-19 01:34:41

标签: postgresql boolean grouping logical-operators logical-and

我有一个名为'apple'的表,我写了以下查询:

select name, 
       count(name), 
       case when istasty is null then false else istasty end 
from apple 
group by name, istasty; 

这是输出:

enter image description here

我正在尝试使用以下条件对nameistasty标记进行分组:

  1. 当相应的名称列同时为true或false时,则返回false。在上图中,tala同时包含truefalse istasty列。但是,我想返回false,因为它至少有一个错误的istasty列。
  2. 如果在对特定名称列的所有istasty列进行分组后true,则返回true;同样,如果所有istasty列都为false,则返回该特定名称列的false
  3. 通过编写查询,我可以在bool_and中使用postgresql运算符:

    select name, count(name), bool_and(coalesce(istasty = true, false)) from apple group by name;
    

    enter image description here

    有没有办法可以修改我的第一个查询,以便在having clause中添加过滤器以获得与在第二个查询中使用bool_and运算符相同的结果?或者还有其他可行的方法吗?

    请注意我没有使用bool_and运营商。我很感激你的时间。谢谢。

2 个答案:

答案 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()