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