postgresql - sql - 计算`true`值

问题描述 投票:75回答:9
myCol
------
 true
 true
 true
 false
 false
 null

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

select count(*), count(myCol);

我得到6, 5

我得到5,因为它不计算null条目。

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

(这是一个简化,我实际上在count函数中使用了一个更复杂的表达式)

编辑摘要:我还想在查询中包含普通计数(*),因此不能使用where子句

sql postgresql
9个回答
104
投票
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>

58
投票

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

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

你得到6,3


48
投票

从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;

44
投票

可能,最好的方法是使用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


15
投票

最短和最懒的(没有铸造)解决方案是使用公式:

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);

7
投票
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;

7
投票

只需将布尔字段转换为整数并进行求和即可。这将适用于postgresql:

select sum(myCol::int) from <table name>

希望有所帮助!


6
投票

在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
;

4
投票
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
© www.soinside.com 2019 - 2024. All rights reserved.