2012-02-06 13 views
25

Soy nuevo en Oracle, por lo que mi pregunta puede sonar tonta. Revisé las publicaciones anteriores, pero no tuve suerte. En la tabla, hay una columna que está en blanco, y estoy tratando de averiguar el recuento en blanco en la columna. Traté:campos NULOS o EN BLANCO (ORACLE)

SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL 
SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME = ' ' 
SELECT COUNT (COL_NAME) FROM TABLE WHERE TRIM (COL_NAME)= ' ' 

El resultado de todas las consultas anterior es 0

Sin embargo, cuando lo hice

SELECT COL_NAME DUMP (COL_NAME,1016) FROM TABLE 

me dio:

COL_NAME  DUMP (COL_NAME,1016) 
       NULL 
       NULL 
       NULL 

y así sucesivamente.

Pero hay cientos o miles de campos en blanco/campos vacíos en esa columna. ¿Puede alguien ayudarme a encontrar cómputo de esos campos en blanco/vacíos en esa columna? Estoy usando Toad for Oracle 9.0.1.8

+3

En Oracle NULL y '' (cadena vacía) son equivalentes. Véase también http://stackoverflow.com/questions/203493/why-does-oracle-9i-treat-an-empty-string-as-null –

Respuesta

0

Pruebe la función nvl. select count (nvl (col_name, 0)) de la tabla.

Lo siento, volví a leer el OP. ¿Cuál es la estructura de la mesa? ¿Es la columna varchar o char lo que hará la diferencia?

tratar

select count(col_name), distinct(col_name) from table group by distinct(col_name) 

/no recuerdo si necesita distinta en el grupo de, pero creo que no/

y ver si se le da una vuelta con un nombre de columna que es blanco.

-3

En primer lugar, usted sabe que "en blanco" y "nulo" son dos COMPLETAMENTE DIFERENTES COSAS? ¿Correcto?

Segundo: en la mayoría de los lenguajes de programación, "" significa una "cadena vacía". Una cadena de longitud cero. Sin personajes en ella.

SQL no necesariamente funciona así. Si defino una columna "nombre char (5)", entonces un nombre "en blanco" será " " (5 espacios).

Parece que usted puede ser que desee algo como esto:

select count(*) from my_table where Length(trim(my_column)) = 0; 

"Trim()" es una de las muchas funciones de Oracle que se pueden utilizar en PL/SQL. Está documentado aquí:

http://www.techonthenet.com/oracle/functions/trim.php

'Espero que ayude!

+1

En Oracle, una cadena vacía es lo mismo que null. Entre otras cosas, esto significa que la consulta que proporcionó no funcionará, ya que se resolverá como 'trim (my_column) = null', que siempre es falso. – Allan

+0

@Allan - No, "NULL" y "cadena vacía" son dos cosas muy diferentes en C, en C++, en Java, en C# ... y en SQL. Aquí hay un enlace de "Ask Tom" (Tom Kyte, VP @Oracle): http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:5984520277372 – paulsm4

+0

PD: Modifiqué mi publicación para que funcione con Oracle, MSSQL, MySQL y DB2 – paulsm4

2

No puede contar nulos (al menos no en Oracle). En su lugar, intente esto

SELECT count(1) FROM TABLE WHERE COL_NAME IS NULL 
9

Una columna NULL no es contable, sin embargo, una fila que tiene una columna NULL es.Por lo tanto, esto debería hacer lo que está buscando:

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL OR LENGTH(TRIM (COL_NAME)) = 0 

Tenga en cuenta que hay caracteres que no son de impresión y que esto no resolverá. Por ejemplo, U + 00A0 es el carácter de espacio no fraccionado y una línea que contiene eso aparecerá visualmente vacía, pero no será encontrada por las pruebas anteriores.

40

COUNT(expresion) devuelve el recuento de filas donde expresion es no nulo. Entonces, SELECT COUNT (COL_NAME) FROM TABLE WHERE COL_NAME IS NULL devolverá 0, porque solo está contando col_name donde col_name es nulo, y un recuento de nada más que nulos es cero. COUNT(*) devolverá el número de filas de la consulta:

SELECT COUNT (*) FROM TABLE WHERE COL_NAME IS NULL 

Las otras dos consultas son probablemente no devolver cualquier filas, ya que están tratando de encontrar equivalencias en las cuerdas con un carácter en blanco, y la consulta volcado indica que la columna en realidad tiene nulos.

Si tiene filas con cadenas variables de caracteres de espacio que desee incluir en el conteo, utilice:

SELECT COUNT (*) FROM TABLE WHERE trim(COL_NAME) IS NULL 

trim(COL_NAME) eliminará principio y espacios que terminan. Si la cadena no es más que espacios, la cadena se convierte en '', que es equivalente a nulo en Oracle.

+4

Gran respuesta (+1). A propósito, el tipo de cadena de Oracle se llama "VARCHAR2" porque se comporta y continuará comportándose de una manera no estándar (es decir, equivale a NULL con cadena vacía). VARCHAR, aunque actualmente es idéntico a VARCHAR2, en el futuro podría comenzar a comportarse de una forma más estándar (es decir, distinguir entre NULL y cadena vacía). –

0
SELECT COUNT (COL_NAME) 
FROM TABLE 
WHERE TRIM (COL_NAME) IS NULL 
or COL_NAME='NULL' 
+3

es esa una respuesta? En caso afirmativo, explique lo que está haciendo y formatee el código. – stefan

2

Así que me pregunté sobre lo mismo, pero al mismo tiempo tenía una solución para esto. Quería una consulta que incluyera todas las filas en la tabla y contara tanto espacios en blanco como espacios en blanco. Así que se me ocurrió esto.

SELECT COUNT(col_name)         VALUE_COUNT 
     COUNT(NVL(col_name, 'X') - COUNT(col_name)  NULL_VALUE_COUNT 
FROM table 
[CONDITIONS] 

En lugar de la función NVL que puede contar la columna de clave principal para obtener el número total de filas

Funciona como un encanto

0
DROP TABLE TEST; -- COMMENT THIS OUT FOR THE FIRST RUN 

CREATE TABLE TEST 
(
    COL_NAME, 
    TEST_NAME 
) AS 
(
    SELECT  NULL,   'ACTUAL NULL' FROM DUAL 
    UNION ALL 
    SELECT  '',   'NULL STRING' FROM DUAL 
    UNION ALL 
    SELECT  ' ',   'SINGLE SPACE' FROM DUAL 
    UNION ALL 
    SELECT  ' ',   'DOUBLE SPACE' FROM DUAL 
    UNION ALL 
    SELECT  '   ', 'TEN SPACES' FROM DUAL 
    UNION ALL 
    SELECT  'NONSPACE', 'NONSPACES' FROM DUAL 
) 
; 

SELECT LENGTH(COL_NAME) NUM_OF_SPACES, TEST_NAME 
FROM TEST 
WHERE LENGTH(COL_NAME) > 0   -- THERE IS SOMETHING IN THE FIELD 
    AND TRIM(COL_NAME) IS NULL;  -- WHICH EQUATES TO NULL 

tabla de prueba se redujo.
tabla TEST created.
NUM_OF_SPACES nombreDePrueba


  1 SINGLE SPACE 
     2 DOUBLE SPACE 
     10 TEN SPACES 

Una vez que haya identificado las columnas que contienen espacios en blanco, que envuelven consulta en un recuento. Si realmente necesita identificar los campos para algún tipo de actualización, considere seleccionar ROWID también.

0

Uno NUNCA debe tratar "EN BLANCO" y NULO tiene el mismo.

Anteriormente existía un estándar SQL, Oracle tomó la decisión de diseño de que las cadenas vacías en las columnas VARCHAR/VARCHAR2 eran NULL y que solo había un sentido de NULL (hay teóricos relacionales que diferenciarían entre los datos que nunca se haya solicitado, datos donde existe la respuesta pero el usuario no los conoce, datos en los que no hay respuesta, etc., todos los cuales constituyen una sensación de NULL). Para cuando apareció el estándar SQL y se acordó que NULL y la cadena vacía eran entidades distintas, ya había usuarios de Oracle que tenían un código que suponía que los dos eran equivalentes.Por lo tanto, Oracle se quedó con las opciones de romper el código existente, violar el estándar SQL o introducir algún tipo de parámetro de inicialización que cambiaría la funcionalidad de una cantidad potencialmente grande de consultas. Violar el estándar SQL (en mi humilde opinión) fue el menos perjudicial de estas tres opciones.

Oracle ha dejado abierta la posibilidad de que el tipo de datos VARCHAR cambiaría en una versión futura para cumplir con el estándar SQL (razón por la cual todos usan VARCHAR2 en Oracle ya que el comportamiento del tipo de datos se garantiza que seguirá siendo el mismo) .

Cuestiones relacionadas