2009-04-23 25 views
5

¿Cómo selecciono algunas columnas en una tabla que solo contiene valores NULOS para todas las filas? Supongamos que si la tabla tiene 100 columnas, entre estas 100 columnas 60 columnas tiene valores nulos. ¿Cómo puedo escribir dónde estoy para verificar si 60 columnas son nulas?Consulta SQL para comprobar si 40 columnas en la tabla es nula

+0

python, C#, y ruby? ¿Podría ayudarnos proporcionando la base de datos que está utilizando? – Damovisa

+0

¿Quiere decir donde estas columnas son nulas para todas las filas? 40 o 60? ¿Qué base de datos? –

+0

No entiendo la pregunta. ¿Desea saber para ciertas columnas si hay al menos un valor nulo en todas las filas? O si todos los valores son nulos? ¿O confundes filas con columnas? –

Respuesta

7
where c1 is null and c2 is null ... and c60 is null 

acceso directo mediante string concatenation (sintaxis de Oracle):

where c1||c2||c3 ... c59||c60 is null 
+0

Desafortunadamente, el último bit se basa en la incapacidad cerebral de Brain para decir la diferencia entre una cadena vacía y NULL. No es una buena solución. – paxdiablo

+0

Pero voy a votar porque el primer bit es la forma correcta de hacerlo, sin posibilidad de refactorizar la tabla DB. – paxdiablo

+1

Si su SQL Server, podría usar coalesce ... – Naren

16

tal vez con un COALESCE

SELECT * FROM table WHERE coalesce(col1, col2, col3, ..., colN) IS NULL 
+0

Si hay alguna posibilidad de utilizar un índice en cualquiera de estos campos, lo ha eliminado al ponerle una función. – dkretz

+0

Sí, las funciones por fila son un asesino de rendimiento en cualquier mesa de tamaño decente. – paxdiablo

+0

coalesce solo funciona cuando todas esas columnas tienen tipos de datos compatibles (al menos en Oracle no funciona para una combinación de columnas de número, fecha y varchar) –

0

Sería de gran ayuda saber que la carne deshuesada que está utilizando y quizá cuál o cuáles han db framework si usa uno.

Esto debería funcionar en cualquier base de datos.

Algo como esto probablemente sería un buen procedimiento almacenado, ya que no hay parámetros de entrada para él.

select count(*) from table where col1 is null or col2 is null ... 
1

¿Estás tratando de averiguar si un conjunto específico de 60 columnas son nulos, o hacer lo que desea es averiguar si cualquiera 60 de las 100 columnas son nulos (no necesariamente el mismo 60 para cada fila ?)

Si es esto último, una forma de hacerlo en el oráculo sería utilizar la función NVL2, así:

select ... where (nvl2(col1,0,1)+nvl2(col2,0,1)+...+nvl2(col100,0,1) > 59) 

una prueba rápida de esta idea:

select 'dummy' from dual where nvl2('somevalue',0,1) + nvl2(null,0,1) > 1 

Devuelve 0 filas rato:

select 'dummy' from dual where nvl2(null,0,1) + nvl2(null,0,1) > 1 

Devuelve 1 fila como se esperaba desde hace más de una de las columnas son nulos.

1

En primer lugar, si tiene una tabla que tiene tantos nulos y utiliza SQL Server 2008, puede definir la tabla con columnas dispersas (http://msdn.microsoft.com/en-us/library/cc280604.aspx).

En segundo lugar, no estoy seguro de si la fusión resuelve la pregunta: parece que Ammu realmente podría querer encontrar la lista de columnas que son nulas para todas las filas, pero podría haber malentendido. Sin embargo - es una pregunta interesante, así que escribí un procedimiento para listar las columnas NULL para una mesa determinada:

IF (OBJECT_ID(N'PrintNullColumns') IS NOT NULL) 
    DROP PROC dbo.PrintNullColumns; 
go 
CREATE PROC dbo.PrintNullColumns(@tablename sysname) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    DECLARE @query nvarchar(max); 
    DECLARE @column sysname; 
    DECLARE columns_cursor CURSOR FOR 
     SELECT c.name 
     FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id 
     WHERE t.name = @tablename AND c.is_nullable = 1; 
    OPEN columns_cursor; 
    FETCH NEXT FROM columns_cursor INTO @column; 
    WHILE (@@FETCH_STATUS = 0) 
    BEGIN 
     SET @query = N' 
     DECLARE @c int 
     SELECT @c = COUNT(*) FROM ' + @tablename + ' WHERE ' + @column + N' IS NOT NULL 
     IF (@c = 0) 
      PRINT (''' + @column + N''');' 
     EXEC (@query); 

     FETCH NEXT FROM columns_cursor INTO @column; 
    END 
    CLOSE columns_cursor; 
    DEALLOCATE columns_cursor; 
    SET NOCOUNT OFF; 
    RETURN; 
END; 
go 
0

Aquí es otro método que me parece lógico también (utilizar Netezza o TSQL)

SELECT KeyColumn, MAX(NVL2(TEST_COLUMN,1,0) AS TEST_COLUMN 
    FROM TABLE1 
GROUP BY KeyColumn 

Así que cada TEST_COLUMN que tiene MAX valor de 0 es una columna que contiene todos los nulos para el conjunto de registros. La función NVL2 indica que si los datos de la columna no son nulos, devuelva un 1, pero si es nulo, entonces devuelva 0.

Tomando el MAX de esa columna, se revelará si alguna de las filas no es nula. Un valor de 1 significa que hay al menos 1 fila que tiene datos. Cero (0) significa que cada fila es nula.

Cuestiones relacionadas