我有一个包含空条目的列,例如此列中的可能值为None, 1, 2, 3
当我使用session.query(func.count(distinct(Entry.col))).scalar()
计算列中唯一条目的数量时,我会返回'3'。
但是当我用session.query(Entry.col).distinct().count()
执行计数时,我会回到'4'。
为什么后一种方法会计算None
,但第一种方法不计算?
答案 0 :(得分:2)
在第一种情况下,生成的查询将如下所示:
SELECT COUNT(DISTINCT(col)) FROM Entry
...而且,正如您可能已经知道的那样,此处COUNT
实际上并不会计算NULL
值。
但在第二种情况下,查询不同,如the doc:
所示SELECT count(1) AS count_1 FROM (
SELECT DISTINCT(col) FROM Entry
) AS anon_1
现在,只计算SELECT DISTINCT
查询返回的行总数(在DISTINCT查询的输出中包含4 - NULL )。
原因很简单:query.count
目的是返回在没有count
子句的情况下运行时查询返回的行数。此方法无法控制应使用哪些列进行计数 - 这就是func.count(...)
的用途。
答案 1 :(得分:1)
MySQL COUNT不计算NULL值,因此如果您通过具有NULL值的字段计算值,则不会按COUNT计算这些行。
DISTINCT只返回不同值的数量,因此包含NULL。