DISTINCT 是否排除空值
Does DISTINCT rule out Nulls
当使用 COUNT (DISTINCT fieldA) 时,它是否排除了计算 fieldA 中的 NULL 值
count(distinct your_column_name)
只计算 your_column_name 中的值不同于 null
的行
count(*)
计算 table 中的所有行,在某些列中有或没有 null
是的,它忽略了 NULL
s。如果你想包含 NULL
s,那么这是一个安全的方法:
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
当使用 COUNT (DISTINCT fieldA) 时,它是否排除了计算 fieldA 中的 NULL 值
count(distinct your_column_name)
只计算 your_column_name 中的值不同于 null
的行count(*)
计算 table 中的所有行,在某些列中有或没有 null
是的,它忽略了 NULL
s。如果你想包含 NULL
s,那么这是一个安全的方法:
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