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

Dan*_* F. 9 oracle plsql

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

我想只计算空值.有没有这样做的功能?

mdm*_*dma 18

我特别不了解Oracle,但ANSI SQL COUNT(rowName)不会计算NULL值,但COUNT(*)确实如此.所以你可以写

SELECT COUNT(*) FROM YourTable WHERE YourColumn IS NULL
Run Code Online (Sandbox Code Playgroud)

它计算YourTable中将YourColumn设置为NULL的行.


Gar*_*ers 10

作为mdma响应的替代方案.如果您不想在可能的位置放置过滤器

SELECT COUNT(case when xxx IS NULL THEN 1 end) cnt_xxx_null
FROM table
Run Code Online (Sandbox Code Playgroud)


Ian*_*ter 6

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.
Run Code Online (Sandbox Code Playgroud)

您可以看到Comm列有4个已知值(即非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
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

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

number of null values
---------------------
                   10
Run Code Online (Sandbox Code Playgroud)