Oracle SQL Developer - 计数函数

Posted

技术标签:

【中文标题】Oracle SQL Developer - 计数函数【英文标题】:Oracle SQL Developer - Count function 【发布时间】:2014-03-02 14:27:42 【问题描述】:

这是从 table1 中选择 * 的输出,我对 count 函数有疑问...我想计算那个 NULL,为了做到这一点,正确的选择是这样做:

select count(*) from table1 where fecha_devolucion is null --> 这给了我正确的答案,但是如果我这样做:

select count(fecha_devolucion)
  from table1
  where fecha_devolucion is null --> this returns 0, why? Isn't the same syntax? 

从表中选择特定字段和 * 有什么区别?

【问题讨论】:

【参考方案1】:

来自文档 (http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions032.htm):

如果指定 expr,则 COUNT 返回 expr 所在的行数 不为空。 ...

如果指定星号 (*),则此函数返回所有行...

换句话说,COUNT(fecha_devolucion) 计算该列的非 NULL 值。 COUNT(*) 计算总行数,与值无关。

【讨论】:

【参考方案2】:

这是获取计数的另一种方法:

SELECT SUM(NVL(fecha_devolucion,1)) FROM table1 WHERE fecha_devolucion IS NULL;

【讨论】:

【参考方案3】:

让我们比较一下这两个查询:

select count(*)
from table1
where fecha_devolucion is null;

select count(fecha_devolucion)
from table1
where fecha_devolucion is null;

我认为你误解了count() 函数。此函数计算其参数列表中非NULL 值的数量。使用常量或*,它会计算所有行。

所以,第一个计算所有匹配的行。第二个计算fecha_devolucion 的所有非NULL 值。但是由于where 子句,没有这样的值。

顺便说一句,你也可以这样做:

select sum(case fecha_devolucion is null then 1 else 0 end) as Nullfecha_devolucion
from table1;

【讨论】:

以上是关于Oracle SQL Developer - 计数函数的主要内容,如果未能解决你的问题,请参考以下文章

sql developer 如何在界面上创建序列

Oracle通过PL/SQL Developer导出数据为CSV格式,VARCHAR2类型的字段如果存入的是数值(例如3307830000004059)太长,最后一位会被置为0

oracle sql developer工具 如何给用户分配权限

将 SQL Server Express 升级到 Developer 性能计数器注册表一致性错误

怎样在pl/sql developer中给oracle添加一个调度作业

pl/sql developer中文乱码,为啥呢?怎么解决?Oracle问题