6

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

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

这是输出:

在此处输入图像描述

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

  1. 当对应的名称列同时存在真假时,我返回假。在上图中,tala同时具有truefalse istasty列。但是,我想返回 false,因为它至少有一个 falseistasty列。
  2. 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运算符。我很感激你的时间。谢谢你。

4

2 回答 2

5

使用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子句,您可以在与条件匹配的查询中排除/包含特定组。

于 2018-02-19T01:41:54.263 回答
0

您的逻辑(仅当所有值都为真时才返回真)等同于获取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().

于 2018-02-19T04:03:07.520 回答