Supprimer des lignes du tableau où l'un des champs de colonne est nul


11

Existe-t-il un moyen de supprimer une ligne d'une table où l'un des champs de colonne est nul sans spécifier explicitement quelle colonne est nulle?

J'utilise postgreSQL.

Voici mon schéma de relation:

  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 | 

Merci

Réponses:


18

Je vois deux façons de procéder:

Avec du SQL standard simple, listez simplement toutes les colonnes et combinez-les avec un OU:

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;

Une autre solution (spécifique à Postgres) est la comparaison de toute la ligne avec NOT NULL

select *
from the_table
where the_table is not null;

renverra uniquement les lignes où toutes les colonnes ne sont pas nulles. Vous voulez le contraire, vous devez donc nier que where not (the_table is not null)la condition where the_table is nullest quelque chose de différent - qui ne correspond qu'aux lignes où toutes les colonnes sont nulles.

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

Je vous remercie! Je pense que la deuxième solution est la solution que je cherchais.
dhaliman


J'aime vraiment l' where not (the_table is not null);approche claire et concise . Le mieux que je puisse penser en général SQL est NATURAL JOIN.
lad2025

0

Si vous ne souhaitez pas spécifier chaque colonne que vous pourriez utiliser NOT EXISTS ... NATURAL JOIN.

Attention! Cette solution n'est pas la meilleure du point de vue des performances. Il devrait fonctionner sur Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 et supérieur.

Mise en place:

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  |
+----+-------------+---------+--------------+------+------+-------+-------+

Et interrogez:

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

Production:

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

DBFiddle Demo

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.