我有一个表a
,其中sdate
列为TIMESTAMP
我想计算sdate
为空的行数。
我在做什么
SELECT sdate
FROM a
WHERE sdate IS NULL
我获得13
行。
所以我之后做的是:
SELECT count(sdate)
FROM a
WHERE sdate IS NULL
我希望得到13
,但我得到0
。
我不明白为什么。
当我将其更改为:
SELECT count(*)
FROM a
WHERE sdate IS NULL
我得到13
正确的结果。
有人可以解释为什么SELECT count(sdate)
接近返回错误结果吗?
答案 0 :(得分:2)
使用以下查询计算时得到0结果:
SELECT count(sdate)
FROM a
WHERE sdate IS NULL
因为COUNT()
没有考虑NULL值。 COUNT()
仅考虑非NULL值。
与使用时相反:
SELECT count(*)
FROM a
WHERE sdate IS NULL
计算整个表格中的行数(因为您使用的是*
)。
以下是SQLFiddle,COUNT(*)
和COUNT(1)
都会返回结果。
答案 1 :(得分:0)
COUNT aggregate采用表达式,它只计算不 NULL的行。例如;
COUNT(*)
- 或COUNT(1)
,例如。 - 计算每一行。
COUNT(col)
仅计算col
不 NULL的行。
COUNT(NULL)
- 始终为零。
在这种情况下,由于所选行(全部)的sdate列具有空值,因此COUNT(sdate)
中的行未计数,这导致正确数为0.
答案 2 :(得分:0)
select count(null);
count
-------
0
(1 row)
Time: 1.772 ms
为什么会感到惊讶?...
空值表示未知值,并且未知 两个未知值是否相等。)此行为符合 SQL标准。
count(表达式)任何bigint数量的输入行的值 表达式不为空