【问题标题】:In Postgresql, after grouping, return false if any value of a column is false. If all values are true/false, then return true/false respectively在 Postgresql 中,分组后,如果列的任何值为 false,则返回 false。如果所有值都是真/假,则分别返回真/假
【发布时间】:2018-07-29 05:39:23
【问题描述】:

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

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

这是输出:

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

  1. 当对应的名称列同时存在真假时,则返回假。在上图中,tala 具有 truefalse istasty 列。但是,我想返回 false,因为它至少有一个 false istasty 列。
  2. 如果在对特定名称列的所有istasty 列进行分组后是true,则返回true;同样,如果所有istasty 列都是false,则为该特定名称列返回false

我可以通过编写查询在postgresql 中使用bool_and 运算符来实现:

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

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

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

【问题讨论】:

  • 不相关,但是:coalesce(istasty = true, false)coalesce(istasty, false) 相同。

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


【解决方案1】:

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

【讨论】:

  • 谢谢。小评论:代替 !isTasty Postgresql 接受 ' WHEN istasty IS FALSE..
【解决方案2】:

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

【讨论】:

  • 您可以使用 bool_and()bool_or() 聚合布尔值
猜你喜欢
  • 2021-10-15
  • 2016-05-03
  • 1970-01-01
  • 2012-10-12
  • 1970-01-01
  • 2013-06-14
  • 2017-04-01
  • 2019-03-10
  • 1970-01-01
相关资源
最近更新 更多