如何在 Oracle/PLSQL 中仅计算 NULL 值?

问题描述 投票:0回答:9

如何在 Oracle/PLSQL 中仅计算 NULL 值?

我只想计算空值。有没有一个函数可以做到这一点?

oracle-database plsql
9个回答
19
投票

我不太了解 Oracle,但 ANSI SQL,

COUNT(rowName)
不计算
NULL
值,但
COUNT(*)
计算。这样你就可以写了

SELECT COUNT(*) FROM YourTable WHERE YourColumn IS NULL

计算 YourTable 中 YourColumn 设置为 NULL 的行数。


11
投票

作为 mdma 响应的替代方案。 如果你不想在可以的地方放一个过滤器

SELECT COUNT(case when xxx IS NULL THEN 1 end) cnt_xxx_null
FROM table

7
投票

Oracle 文档指出:

除 COUNT(*) 和 GROUPING 忽略空值。 您可以使用 NVL 功能 聚合函数的参数 用一个值代替 null。

作为示例,使用 scott 模式:

SQL> select empno, sal, comm
  2  from emp;

     EMPNO        SAL       COMM
---------- ---------- ----------
      7369        800
      7499       1600        300
      7521       1250        500
      7566       2975
      7654       1250       1400
      7698       2850
      7782       2450
      7788       3000
      7839       5000
      7844       1500          0
      7876       1100
      7900        950
      7902       3000
      7934       1300

14 rows selected.

您可以看到 Comm 列有 4 个已知值(即 Not null)和 10 个未知值(即 Null)

由于

count(your_column_name)
忽略空值,您需要用未知值替换您可以引用的值。这可以使用 NVL 函数来实现。

SQL> select count(nvl(comm, -1)) "number of null values"
  2  from emp
  3  where nvl(comm, -1) = -1;

number of null values
---------------------
                   10

我使用值“-1”作为空值的“别名”,因为我知道“-1”不是 comm 列中的现有值。

编辑:

遵循罗布的建议。可以从上面的示例中删除 where 子句并使用 NVL2 函数,如下所示:

SQL> select count(nvl2(comm,null,-1)) "number of null values"
  2  from emp
  3  /

number of null values
---------------------
                   10

1
投票

如果您也想使用 null 来计算其他值,那么使用 COALESCE 函数将缩短执行时间

Oracle NVL 和 Coalesce 之间的差异

SELECT COUNT(COALESCE( _COLUMN, 1)) AS CNT FROM _TABLE

1
投票

我可能会尝试反转零值,看看结果

SELECT
 COUNT(DECODE(YourField, null, 1, null)) Nulls,
 count(*) Everything,
 COUNT(YourField) NotNulls
FROM YourTable

一切都应该等于 null + notnulls


0
投票
select count(nvl(values, 0)) from emp where values is null;

0
投票

功能:

create or replace function xxhrs_fb_count_null
return number
as
l_count_null number;
begin
  select count(*) into l_count_null from emp where comm is null;
  return l_count_null;
end;

用途:

select xxhrs_fb_count_null from dual

0
投票

我相信您的需求如下: 表

emp
有 100 行。对于 20 名员工,
HIRE_DATE
列是
NULL
。所以基本上,你想要得到 20 作为输出。 这是除了本论坛其他贡献者给出的答案之外的另一种方法。

-- COUNT (1) would return 100
-- COUNT (hire_date) would return 80
-- 100 - 80 = 20
SELECT   COUNT (1) -
                 COUNT (hire_date)
                 AS null_count
FROM      emp;

0
投票

选择 count(*) - count(replace(comm,null,1)) as no_of_nulls from emp;

© www.soinside.com 2019 - 2024. All rights reserved.