myCol
------
true
true
true
false
false
null
在上表中,如果我这样做:
select count(*), count(myCol);
我得到了6, 5
我得到5
,因为它不计算null条目。
我如何计算真值的数量(在本例中为3)?
(这是一个简化,实际上我在count函数中使用了一个复杂得多的表达式)
编辑摘要:我还想在查询中包含一个普通计数(*),所以不能使用where子句
发布于 2011-03-23 03:29:26
SELECT COALESCE(sum(CASE WHEN myCol THEN 1 ELSE 0 END),0) FROM <table name>
或者,正如你自己发现的那样:
SELECT count(CASE WHEN myCol THEN 1 END) FROM <table name>
发布于 2016-05-20 05:28:06
从PostgreSQL 9.4开始,就有了FILTER
clause,它允许非常简洁的查询来计算真值:
select count(*) filter (where myCol)
from tbl;
上面的查询是一个不好的例子,因为一个简单的WHERE子句就足够了,并且只是为了演示语法。FILTER子句的亮点在于它很容易与其他聚合组合在一起:
select count(*), -- all
count(myCol), -- non null
count(*) filter (where myCol) -- true
from tbl;
对于使用另一列作为谓词的列上的聚合,该子句特别方便,同时允许在单个查询中提取不同过滤的聚合:
select count(*),
sum(otherCol) filter (where myCol)
from tbl;
发布于 2014-01-04 02:08:52
将布尔值转换为整数并求和。
SELECT count(*),sum(myCol::int);
你得到了6,3
。
https://stackoverflow.com/questions/5396498
复制相似问题