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