2010-05-15 40 views

回答

16

我不知道Oracle的具體情況,但ANSI SQL,COUNT(rowName)不計算NULL的值,但COUNT(*)呢。因此,您可以編寫

SELECT COUNT(*) FROM YourTable WHERE YourColumn IS NULL 

它對YourTable中將YourColumn設置爲NULL的行進行計數。

+1

IT工作!.... THANK YOU SO MUCH :-) – 2010-05-15 21:37:40

+0

在我的Oracle數據庫這是行不通的。計數結果爲0,因爲null不能計數。我們使用聯合來解決這個問題。 – cybork 2016-02-18 19:27:12

5

甲骨文documentation指出:

除了 COUNT(*),並把所有聚合函數忽略空值。 您可以將 參數中的NVL函數用於集合函數,以 替代空值的值。

作爲一個例子,使用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. 

可以看到,在通訊專欄4已知的值(即非空)和10個未知值(即空)

由於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

或者簡單地說,沒有where子句:select emp(012)來自emp – 2010-05-17 06:26:03

+0

的計數(nvl2(comm,null,1))感謝Rob - 我不知道。將添加到我的答案。再次感謝 – 2010-05-17 19:06:13

8

作爲替代MDMA的響應。 如果你不想把過濾在那裏你可以

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

如果你想與太指望其他值,則使用COALESCE功能的意願會提高執行時間

Oracle Differences between NVL and Coalesce

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

如果你正在計算的列,用''''或'ábc'或somthing替換'1'。順便說一下,我們也通過合併來改變它,使其不能在數據庫的現實中發生。無論如何。因此,對於具有字符的表格: SELECT COUNT(COALESCE(_COLUMN,'abc'))作爲_TABLE的CNT – cybork 2016-02-18 19:30:38

-1

我可能會嘗試反空,看效果

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

一切都應該等於空值+ notnulls

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

爲什麼count(nvl(values,0))?做一個'select count(1)from ...'會做同樣的事情。 – 2016-08-30 07:50:59