DISTINCT 是否排除空值

Does DISTINCT rule out Nulls

当使用 COUNT (DISTINCT fieldA) 时,它是否排除了计算 fieldA 中的 NULL 值

count(distinct your_column_name)  

只计算 your_column_name 中的值不同于 null

的行
count(*) 

计算 table 中的所有行,在某些列中有或没有 null

是的,它忽略了 NULLs。如果你想包含 NULLs,那么这是一个安全的方法:

SELECT COUNT(DISTINCT fieldA) + MAX(CASE WHEN fieldA IS NULL THEN 1 ELSE 0 END)

你的标题和叙述之间有 2 个问题。

DISTINCT 不消除(排除)空值

但是

聚合函数忽略空值

正如其他人所提到的,如果您想计算所有 NON NULL DISTINCT 值,请使用您提到的代码。

SELECT COUNT(DISTINCT columnName)

如果您想将所有空值都计为另一个值,您可以使用两种方法中的一种。

1) 使用 COALESCE() 消除数据集中未表示的值的空值。例如

 SELECT COUNT(DISTINCT COALESCE(columnName,'|||||||||'))

2) 更确定的方法是使用类似于 Gordon 展示的条件聚合:

为了展示 distinct 如何不消除空值:

CREATE TABLE DistinctTest (Col INT)
INSERT INTO DistinctTest (Col) VALUES (NULL),(1),(2),(3),(NULL)

SELECT DISTINCT  *
FROM
    DistinctTest