2012-01-03 16 views
16

Necesito comprobar si una columna NO es NULL en mi instrucción de SQL.Compruebe si alguna columna NO ES NULA

Mi consulta SQL:

select column_a, column_b, column_c, column_d, column_x 
from myTable 

tengo una gran cantidad de columnas en mi selección. Así que tengo un problema de rendimiento, Si yo haría lo siguiente:

select column_a, column_b, column_c, column_d, column_x 
from myTable 
where column_a is not null or column_b is not null or column_c is not null 
or column_x is not null 

¿Hay otra manera (mejor) para comprobar si hay algún columnas que no son NULL?

+1

¿Por qué dices que es un problema de rendimiento? ¿La mayoría de estos valores de columna en realidad son 'NULL', por lo que está escaneando filas innecesarias? ¿Cómo has llegado a esta conclusión? –

+0

¿Podría poner primero las columnas que contienen la menor cantidad de NULL? ¿Qué tal un índice en todas las columnas? –

+0

¿Desea saber si una columna tiene un valor NULL (como se indica en el título de la pregunta y el cuerpo de la pregunta), o si alguna columna ** no ** tiene un valor NULL (como está escrito en su consulta SQL). Dos preguntas completamente diferentes. – RedFilter

Respuesta

22

Puede usar COALESCE para esto. COALESCE devuelve el primer valor no nulo, si corresponde. Es probable que esto no funcione mejor, pero es mucho más legible.

Ejemplo:

where coalesce(column_a, column_b, column_c, column_x) is not null 

Dependiendo de la cardinalidad de sus datos, puede ser capaz de añadir índices para mejorar el rendimiento.

Otra posibilidad es utilizar la columna calculada persistente que le indica si las cuatro columnas son NULL o no.

+1

Usted * podría * pero no sabría qué columna es nula (excepto que un resultado nulo significa que todas son). Si OP quiere confirmar que cada columna es nula, entonces un COALESCE funcionaría bien. Sin embargo, no sería una forma concisa detectar si la columna * any * es nula. –

+3

@Brad: el OP selecciona donde cualquier columna es ** no ** nula. 'COALESCE' funciona perfectamente para esto y no proporciona más información que la consulta original. – RedFilter

+1

Estoy entendiendo la pregunta como "cómo puedo detectar si alguna de estas columnas es nula". Un COALESCE no le dirá si una sola columna es nula, solo que al menos una no es o todas lo son. Entonces, mientras la primera columna no sea nula, en realidad ignorarás una prueba en los próximos tres. (Del mismo modo para los primeros dos comparados contra los dos últimos, y así sucesivamente). Tal vez estoy malinterpretando la pregunta. –

2

Una forma de atacar esto podría ser agregar una columna de bit adicional que realice un seguimiento de si hay algún valor o no.

Pros

  • se puede implementar con disparadores de modo que no es necesario cambiar el resto de su código
  • No requiere la exploración de las otras columnas
  • Esa columna puede ser indexado

Contras

  • Sus datos se de-normalizada
  • más complicado más mantenimiento/
  • más espacio de almacenamiento para la columna adicional

si las ventajas superan a las desventajas dependen de la cantidad de un rendimiento golpearte tomando al mirar las otras columnas. Perfíllo antes de comprometerse!

+0

El índice probablemente no se usaría a menos que cubriera 'column_a, column_b, column_c, column_d, column_x' de todos modos debido al costo de las búsquedas a menos que estuvieran en una situación inusual donde' NULL' era para todas las columnas para la gran mayoría de filas así que también podría usar un índice filtrado o una vista indexada con los criterios 'NOT NULL' directamente. –

+0

Hola RQDQ, gracias por tu respuesta. Supongo que es una gran sobrecarga, si hago una columna separada para este valor. Tal vez en la consulta sql con una tabla temperary? – bitsmuggler

2

Generalmente me gusta la sugerencia de @ALFILTER de COALESCE, pero otra solución podría ser usar la función CHECKSUM(). Por supuesto, el valor de la suma de comprobación para todos los valores NULL depende de las columnas y los tipos de datos, por lo que deberá ejecutar primero una consulta para obtener ese valor. Algo así como:

select CHECKSUM(*) AS [All_NULL_Value] 
from myTable 
where column_a is null 
AND column_b is null 
AND column_c is null 
AND column_d is null 
AND column_x is null 

entonces usted puede hacer esto:

select column_a, column_b, column_c, column_d, column_x 
from myTable 
where CHECKSUM(*) <> {All_NULL_Value_obtained_above} 

No estoy seguro de si esto funciona mejor o peor que la idea COALESCE pero podría valer la pena probar.

0

Respuesta aceptada hace 5 años, pero, como dijo Brad, por coalesce título de la pregunta es enfoque erróneo. Si en algunos casos que realmente necesita para comprobar o cualquier parámetro es nulo, puede utilizar esto:

where convert(binary, column_a) + convert(binary, column_b) + convert(binary, column_c), + convert(binary, column_k) is null 
+0

"coalesce is wrong approach" ¿Por qué? –

Cuestiones relacionadas