Múltiples soluciones para: algunos nulos, todos nulos, columnas simples y múltiples, además de hacerlo RÁPIDO usando Top 1
Si necesita probar varias columnas, puede usar lo siguiente:
Column_1 Column_2 Column_3
-------- -------- --------
1 2 NULL
1 NULL NULL
5 6 NULL
Primero , pruebe los NULL y cuéntelos:
select
sum(case when Column_1 is null then 1 else 0 end) as Column_1,
sum(case when Column_2 is null then 1 else 0 end) as Column_2,
sum(case when Column_3 is null then 1 else 0 end) as Column_3,
from TestTable
Produce un recuento de NULL:
Column_1 Column_2 Column_3
0 1 3
Donde el resultado es 0, no hay NULL.
En segundo lugar , cuentemos los no NULL:
select
sum(case when Column_1 is null then 0 else 1 end) as Column_1,
sum(case when Column_2 is null then 0 else 1 end) as Column_2,
sum(case when Column_3 is null then 0 else 1 end) as Column_3,
from TestTable
... Pero debido a que estamos contando no NULL aquí, esto se puede simplificar para:
select
count(Column_1) as Column_1,
count(Column_2) as Column_2,
count(Column_3) as Column_3,
from TestTable
Cualquiera de los dos produce:
Column_1 Column_2 Column_3
3 2 0
Donde el resultado es 0, la columna está compuesta completamente por NULL.
Por último , si solo necesita verificar una columna específica, TOP 1 es más rápido porque debería detenerse en el primer golpe. Luego, opcionalmente, puede utilizar count (*) para obtener un resultado de estilo booleano:
select top 1 'There is at least one NULL' from TestTable where Column_3 is NULL
select count(*) from (select top 1 'There is at least one NULL' AS note from TestTable where Column_3 is NULL) a
0 = No hay NULL, 1 = Hay al menos un NULL
o
select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL
select count(*) from (select top 1 'There is at least one non-NULL' AS note from TestTable where Column_3 is not NULL) a
0 = Todos son NULL, 1 = Hay al menos un no NULL
Espero que esto ayude.
UNPIVOT traduce columnas en filas. En el proceso elimina valores NULL ( referencia ).
Dada la entrada
la consulta UNPIVOT
producirá la salida
Lamentablemente, la fila 4 se ha eliminado por completo, ya que solo tiene NULL. Se puede reiniciar convenientemente inyectando un valor ficticio en la consulta de origen:
Al agregar las filas en la ID, podemos contar los valores no nulos. Una comparación con el número total de columnas en la tabla de origen identificará las filas que contienen uno o más NULL.
Calculo 3 como número de columnas en la tabla fuente #t
+ 1 para la columna ficticia inyectada
- 1 para ID, que no está SIN AVANZAR
Este valor se puede obtener en tiempo de ejecución examinando las tablas del catálogo.
Las filas originales se pueden recuperar uniéndose a los resultados.
Si se van a investigar valores distintos de NULL, se pueden incluir en una cláusula where:
Discusión
Esto requiere un identificador que se lleva a través de UNPIVOT. Una clave sería lo mejor. Si no existe ninguno , la función de ventana ROW_NUMBER () puede inyectarlo , aunque puede ser costoso ejecutarlo.
Todas las columnas deben enumerarse explícitamente dentro de la cláusula UNPIVOT. Se pueden arrastrar usando SSMS, como sugirió @ db2. No será dinámico cuando la definición de la tabla cambie, como lo sería la sugerencia de Aaron Bertrand. Sin embargo, este es el caso de casi todos los SQL.
Para mi conjunto de datos bastante limitado, el plan de ejecución es un análisis de índice agrupado y un agregado de flujo. Esto será más costoso de memoria que un escaneo directo de la tabla y muchas cláusulas OR.
fuente