postgresql – sql – “真”值的计数

myCol ------ true true true false false null 

在上表中,如果我这样做:

 select count(*), count(myCol); 

我得到6, 5

我得到5因为它不包括空条目。

我如何计算真值的数量(例子中是3)?

(这是一个简化,我实际上在计数function中使用更复杂的expression式)

编辑总结:我也想在查询中包含一个普通计数(*),所以不能使用where子句

 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> 

大概,最好的办法是使用nullif函数。

一般来说

 select count(nullif(myCol = false, true)), -- count true values count(nullif(myCol = true, true)), -- count false values count(myCol); 

或者简而言之

 select count(nullif(myCol, true)), -- count false values count(nullif(myCol, false)), -- count true values count(myCol); 

http://www.postgresql.org/docs/9.0/static/functions-conditional.html

将布尔值转换为整数和求和。

 SELECT count(*),sum(myCol::int); 

你得到6,3

自PostgreSQL 9.4以来有FILTER子句 :

 -- all not null true select count(*), count(myCol), count(*) filter (where myCol); 

最短和最懒的(没有铸造)解决scheme将使用公式:

 SELECT COUNT(myCol OR NULL) FROM myTable; 

自己尝试一下:

 SELECT COUNT(x < 7 OR NULL) FROM GENERATE_SERIES(0,10) t(x); 

给出了相同的结果

 SELECT SUM(CASE WHEN x < 7 THEN 1 ELSE 0 END) FROM GENERATE_SERIES(0,10) t(x); 
 select f1, CASE WHEN f1 = 't' THEN COUNT(*) WHEN f1 = 'f' THEN COUNT(*) END AS counts, (SELECT COUNT(*) FROM mytable) AS total_counts from mytable group by f1 

或者也许这个

 SELECT SUM(CASE WHEN f1 = 't' THEN 1 END) AS t, SUM(CASE WHEN f1 = 'f' THEN 1 END) AS f, SUM(CASE WHEN f1 NOT IN ('t','f') OR f1 IS NULL THEN 1 END) AS others, SUM(CASE WHEN f1 IS NOT NULL OR f1 IS NULL THEN 1 ELSE 0 END) AS total_count FROM mytable; 

在MySQL中,你也可以这样做:

 SELECT count(*) AS total , sum(myCol) AS countTrue --yes, you can add TRUEs as TRUE=1 and FALSE=0 !! FROM yourTable ; 

我认为在Postgres中,这是有效的:

 SELECT count(*) AS total , sum(myCol::int) AS countTrue --convert Boolean to Integer FROM yourTable ; 

或更好(避免::和使用标准的SQL语法):

 SELECT count(*) AS total , sum(CAST(myCol AS int)) AS countTrue --convert Boolean to Integer FROM yourTable ; 
 SELECT count(*) -- or count(myCol) FROM <table name> -- replace <table name> with your table WHERE myCol = true; 

这是窗口函数的一种方法:

 SELECT DISTINCT *, count(*) over(partition by myCol) FROM <table name>; -- Outputs: -- -------------- -- myCol | count -- ------+------- -- f | 2 -- t | 3 -- | 1