2

我有一列包含空条目,例如此列中的可能值为None, 1, 2, 3

当我计算列中唯一条目的数量时,session.query(func.count(distinct(Entry.col))).scalar()我得到了“3”。

但是当我用 进行计数时session.query(Entry.col).distinct().count(),我得到了“4”。

为什么后一种方法计算None,而第一种方法不计算?

4

2 回答 2

2

在第一种情况下,生成的查询将如下所示:

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(...)就是用途。

于 2013-09-16T07:32:40.347 回答
1

MySQL COUNT 不计算 NULL 值,因此如果您按具有 NULL 值的字段计算值,则该行将不会被 COUNT 计算。

DISTINCT 只返回不同值的数量,因此包括 NULL。

于 2013-09-16T07:19:05.900 回答