PostgreSQL中如何正确实现sum(color = 'red')的条件统计?
PostgreSQL 无WHERE子句条件计数正确写法
报错原因
你执行的SELECT sum(color = ‘red’) FROM table报错的核心原因是:PostgreSQL 不支持布尔类型直接作为sum()聚合函数的入参,color = 'red'返回的是布尔值,sum()仅支持数值类型的聚合计算,因此会抛出类型不匹配的异常。
可行的两种实现写法
写法1:布尔值强转数值后求和
将布尔判断结果强制转换为int类型,true会转为1,false转为0,求和结果就是color值为red的记录总数:
SELECT sum((color = 'red')::int) FROM your_table;
写法2:使用FILTER语法(更推荐)
PostgreSQL 原生支持聚合函数的FILTER过滤语法,可读性更高,也符合SQL标准规范,不需要额外做类型转换:
SELECT count(*) FILTER (WHERE color = 'red') FROM your_table;
该写法的优势是可以非常方便地同时统计多个不同条件的计数,不需要添加WHERE子句或者多表关联,示例如下:
SELECT count(*) FILTER (WHERE color = 'red') AS red_total, count(*) FILTER (WHERE color = 'blue') AS blue_total, count(*) FILTER (WHERE color = 'green') AS green_total FROM your_table;
注意事项
- SQL中的引号需要使用英文半角单引号
',不要使用中文全角引号‘’,否则会触发语法错误。 - 代码中的
your_table需要替换为你实际使用的表名。
内容的提问来源于stack exchange,提问作者iFrong
相关产品推荐
相关产品推荐

