如何在 Oracle/PLSQL 中仅计算 NULL 值?
我只想计算空值。有没有一个函数可以做到这一点?
我不太了解 Oracle,但 ANSI SQL,
COUNT(rowName)
不计算 NULL
值,但 COUNT(*)
计算。这样你就可以写了
SELECT COUNT(*) FROM YourTable WHERE YourColumn IS NULL
计算 YourTable 中 YourColumn 设置为 NULL 的行数。
作为 mdma 响应的替代方案。 如果你不想在可以的地方放一个过滤器
SELECT COUNT(case when xxx IS NULL THEN 1 end) cnt_xxx_null
FROM table
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
如果您也想使用 null 来计算其他值,那么使用 COALESCE 函数将缩短执行时间
SELECT COUNT(COALESCE( _COLUMN, 1)) AS CNT FROM _TABLE
我可能会尝试反转零值,看看结果
SELECT
COUNT(DECODE(YourField, null, 1, null)) Nulls,
count(*) Everything,
COUNT(YourField) NotNulls
FROM YourTable
一切都应该等于 null + notnulls
select count(nvl(values, 0)) from emp where values is null;
功能:
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
我相信您的需求如下: 表
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;
选择 count(*) - count(replace(comm,null,1)) as no_of_nulls from emp;