2010-05-15 26 views

Respuesta

16

No sé Oracle de manera específica, pero ANSI SQL, COUNT(rowName) no cuenta NULL valores, pero COUNT(*) lo hace. Para que pueda escribir

SELECT COUNT(*) FROM YourTable WHERE YourColumn IS NULL 

que cuenta las filas en YourTable que tienen YourColumn puesto a NULL.

+1

funcionó !! .... GRACIAS :-) –

+0

En mi base de datos de Oracle no funciona.Una cuenta da como resultado 0, porque null no se puede contar. Usamos un coalesce para resolver eso. – cybork

5

El Oracle documentation establece que:

Todas las funciones agregadas, a menos COUNT (*) y la agrupación ignoran los valores nulos. Puede usar la función NVL en el argumento para agregar una función a para anular un valor.

Como ejemplo, utilizando el esquema 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. 

Se puede ver que la columna de la Comm ha 4 valores (es decir, no nula) y 10 valores desconocidos (es decir NULL)

conocida Como count(your_column_name) ignora los nulos, debe sustituir los valores desconocidos por algo que pueda consultar. Esto se puede lograr utilizando la función 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 

He utilizado el valor "-1" como el "alias" para mis valores nulos porque saben que "-1" no es un valor existente dentro de la columna de comunicaciones.

EDIT:

Siguiendo la sugerencia de Rob. Es posible eliminar la cláusula WHERE en el ejemplo anterior y utilizar la función NVL2 como se muestra a continuación:

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

number of null values 
--------------------- 
        10 
+1

o simplemente, sin una cláusula where: select count (nvl2 (comm, null, 1)) from emp –

+0

Gracias Rob - No lo sabía. Se agregará a mi respuesta. Gracias de nuevo –

8

Como una alternativa a la respuesta de la MDMA. Si no quiere poner un filtro en el donde se puede

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

Si quiere contar también con otros valores nula entonces el uso de la función COALESCE voluntad mejora el tiempo de ejecución

Oracle Differences between NVL and Coalesce

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

Y si la columna que está contando, reemplace el '1' por '' 1 '' o 'ábc' o algo así. Por cierto, también lo cambiamos para unirnos a algo que no puede suceder en la realidad de la base de datos. De todas formas. Entonces para una tabla que tiene caracteres: SELECCIONAR COUNT (COALESCE (_COLUMN, 'abc')) COMO CNT DESDE _TABLE – cybork

-1

podría tratar de invertir la nula, ver resultados

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

Todo debe ser igual a los nulos + notnulls

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

¿Por qué el 'count (nvl (values, 0))'? haciendo un 'conteo de selección (1) de ...' haría lo mismo. –

Cuestiones relacionadas