如何计算表格中的行数和某个条件为真的行数,而不依赖于这样的子选择:
create table t (a integer);
insert into t (a) values (1), (2), (null);
select
(select count(*) from t) as total_lines,
(select count(*) from t where a = 1) as condition_true
;
total_lines | condition_true
-------------+----------------
3 | 1
答案 0 :(得分:4)
select count(*) as total_lines, count(a = 1 or null) as condition_true
from t
;
total_lines | condition_true
-------------+----------------
3 | 1
它的工作原因是:
首先count(*)
计算所有行数,count(my_column)
只计算my_column不为空的行:
select count(a) as total
from t
;
total
-------
2
第二个(false or null)
会返回null
,因此,只要我的条件不符合,它就会返回null
并且不会被count(condition or null)
计算,而{{1}}只计算非空值。
答案 1 :(得分:2)
使用SUM(condition)
!
select
count(*) as total_lines,
sum(a = 1) as condition_true
from t
看到它正常工作here。
这是有效的,因为在mysql中,true
为1
而false
为0
,因此条件的sum()
将添加1
当它为真时0
当它为假时 - 它实际上计算条件为真的次数。
许多人错误地认为你需要一个case
语句,但你没有使用mysql(你使用其他一些数据库)
答案 2 :(得分:2)
这可以使用条件内部计数轻松完成。我不知道它是否是优化的方法,但它完成了工作
您可以按照以下方式执行此操作
select count(*) as total_lines, COUNT(CASE WHEN a = 1 THEN 1 END) as condition_true from t
你可以在这里查看