Saltar al contenido

Cuenta el número de attributes que son NULL para una fila

Después de mucho trabajar pudimos hallar el resultado de este conflicto que ciertos de nuestros usuarios de este sitio web tienen. Si quieres compartir algo más no dudes en dejar tu conocimiento.

Solución:

Posible sin deletrear columnas. Gire las columnas en sentido contrario a las filas y cuente.

La función agregada count() solo cuenta no-null valores, mientras count(*) cuenta todos filas La forma más corta y rápida de contar valores NULL para más de unas pocas columnas es count(*) - count(col)

Trabaja para ningún mesa con ningún número de columnas de any tipos de datos.

En Postgres 9.3+ con funciones JSON integradas:

SELECT *, (SELECT count(*) - count(v)
           FROM json_each_text(row_to_json(t)) x(k,v)) AS ct_nulls
FROM   tbl t;

Que es x(k,v)?

json_each_text() devuelve un conjunto de filas con dos columnas. Los nombres de columna predeterminados son key y value como se puede ver en el manual donde enlacé. Proporcioné alias de tablas y columnas para que no tengamos que confiar en los nombres predeterminados. La segunda columna se llama v.

O, en cualquier versión de Postgres desde al menos 8.3 con el módulo adicional hstore instalado, incluso más corto y un poco más rápido:

SELECT *,  (SELECT count(*) - count(v) FROM svals(hstore(t)) v) AS ct_nulls
FROM   tbl t;

Esta versión más simple solo devuelve un conjunto de valores únicos. Solo proporciono un alias simple vque se toma automáticamente como tabla y alias de columna

  • ¿La mejor manera de instalar hstore en múltiples esquemas en una base de datos de Postgres?

Dado que la columna adicional es funcionalmente dependiente Yo consideraría no persistir en la mesa en absoluto. En su lugar, calcúlelo sobre la marcha como se demostró anteriormente o cree una pequeña función con un tipo de entrada polimórfica para el propósito:

CREATE OR REPLACE FUNCTION f_ct_nulls(_row anyelement)
  RETURNS int  LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
'SELECT (count(*) - count(v))::int FROM svals(hstore(_row)) v';

(PARALLEL SAFE solo para Postgres 9.6 o posterior).

Después:

SELECT *, f_ct_nulls(t) AS ct_nulls
FROM   tbl t;

Podrías envolver esto en un VIEW

Violín SQL demostrando todo.

Esto también debería responder a su segunda pregunta:

… el nombre de la tabla se obtiene del argumento, no conozco el esquema de una tabla de antemano. Eso significa que necesito actualizar la tabla con el nombre de la tabla de entrada.

En Postgres, puede expresar esto como:

select t.*,
       ((name is null)::int +
        (age is null)::int +
        (sex is null)::int
       ) as numnulls
from table t;

Para implementar esto en una tabla desconocida, deberá usar SQL dinámico y obtener una lista de columnas (digamos de information_schema.columns)).

Recuerda que tienes autorización de añadir una puntuación justa .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *