Eliminar de las filas de la tabla donde cualquiera de los campos de la columna es nulo


11

¿Hay alguna manera de eliminar una fila de una tabla donde alguno de los campos de la columna es nulo sin especificar explícitamente qué columna es nula?

Estoy usando postgreSQL.

Aquí está mi esquema de relación:

  Column    |  Type   |                              Modifiers                               
  --------------+---------+----------------------------------------------------------------------
  id           | integer | not null default  nextval('aurostat.visitor_center_id_seq'::regclass)
  date         | date    | 
  persons      | integer | 
  two_wheelers | integer | 
  cars         | integer | 
  vans         | integer | 
  buses        | integer | 
  autos        | integer | 

Gracias

Respuestas:


18

Veo dos formas de hacerlo:

Con SQL estándar simple, simplemente enumere todas las columnas y combine eso con un OR:

delete from the_table
where date is null
   or persons is null
   or two_wheelers is null
   or cars is null
   or vans is null
   or buses is null
   or autos is null;

Otra solución (específica de Postgres) es la comparación de toda la fila con NOT NULL

select *
from the_table
where the_table is not null;

solo devolverá filas donde todas las columnas no sean nulas. Desea lo contrario, por lo que debe negar que where not (the_table is not null)la condición where the_table is nulles algo diferente, que solo coincide con las filas donde todas las columnas son nulas.

delete from the_table
where not (the_table is not null);

¡Gracias! Creo que la segunda solución es la solución que estaba buscando.
dhaliman

3
eso es ingenioso
Jack dice probar topanswers.xyz

Me gusta mucho el where not (the_table is not null);enfoque claro y conciso . Lo mejor que puedo pensar en general es SQL NATURAL JOIN.
lad2025

0

Si no desea especificar cada columna que podría usar NOT EXISTS ... NATURAL JOIN.

¡Advertencia! Esta solución no es la mejor desde el punto de vista del rendimiento. Debería funcionar en Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 y superior.

Configuración:

CREATE TABLE the_table(
   id           integer not null 
  ,date_          date    
  ,persons       integer 
  ,two_wheelers  integer 
  ,cars          integer 
  ,vans          integer 
  ,buses         integer 
 , autos         integer 
);

INSERT INTO the_table(id, date_, persons, two_wheelers, cars, vans, buses, autos)
VALUES (1, '21/JAN/2018',1,1,1,1,1,1);

INSERT INTO the_table(id, date_, persons, two_wheelers, cars, vans, buses, autos)
VALUES (2, '21/JAN/2018',2,2,2,2,NULL,2);
INSERT INTO the_table(id, date_, persons, two_wheelers, cars, vans, buses, autos)
VALUES (3, '21/JAN/2018',3,3,3,3,NULL,NULL);

SELECT * FROM the_table;

+----+-------------+---------+--------------+------+------+-------+-------+
| id |    date_    | persons | two_wheelers | cars | vans | buses | autos |
+----+-------------+---------+--------------+------+------+-------+-------+
|  1 | 21/JAN/2018 |       1 |            1 |    1 |    1 | 1     | 1     |
|  2 | 21/JAN/2018 |       2 |            2 |    2 |    2 | null  | 2     |
|  3 | 21/JAN/2018 |       3 |            3 |    3 |    3 | null  | null  |
+----+-------------+---------+--------------+------+------+-------+-------+

Y consulta:

DELETE FROM the_table
WHERE NOT EXISTS (SELECT *
                  FROM the_table t1
                  NATURAL JOIN the_table t2
                  WHERE id = the_table.id);

Salida:

+----+-------------+---------+--------------+------+------+-------+-------+
| id |    date_    | persons | two_wheelers | cars | vans | buses | autos |
+----+-------------+---------+--------------+------+------+-------+-------+
|  1 | 21/JAN/2018 |       1 |            1 |    1 |    1 |     1 |     1 |
+----+-------------+---------+--------------+------+------+-------+-------+

DBFiddle Demo

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.