Löschen Sie aus Tabellenzeilen, in denen eines der Spaltenfelder null ist

11

Gibt es eine Möglichkeit, eine Zeile aus einer Tabelle zu löschen, in der eines der Spaltenfelder null ist, ohne explizit anzugeben, welche Spalte null ist?

Ich benutze postgreSQL.

Hier ist mein Beziehungsschema:

  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 | 

Vielen Dank

Dhaliman
quelle

Antworten:

18

Ich sehe zwei Möglichkeiten, dies zu tun:

Listen Sie mit Standard-SQL einfach alle Spalten auf und kombinieren Sie diese mit einem ODER:

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;

Eine andere (Postgres-spezifische) Lösung ist der Vergleich der gesamten Zeile mit NOT NULL

select *
from the_table
where the_table is not null;

gibt nur Zeilen zurück, in denen nicht alle Spalten null sind. Sie möchten das Gegenteil, also müssen Sie negieren, dass where not (the_table is not null)die Bedingung where the_table is nulletwas anderes ist - das stimmt nur mit Zeilen überein, in denen alle Spalten null sind.

delete from the_table
where not (the_table is not null);
ein Pferd ohne Name
quelle
Danke! Ich denke, die zweite Lösung ist die Lösung, nach der ich gesucht habe.
Dhaliman
3
Das ist genial
Jack sagt, versuchen Sie es mit topanswers.xyz
Ich mag den klaren und prägnanten where not (the_table is not null);Ansatz sehr. Das Beste, was ich mir im Allgemeinen von SQL vorstellen kann, ist NATURAL JOIN.
lad2025
0

Wenn Sie nicht jede Spalte angeben möchten, können Sie sie verwenden NOT EXISTS ... NATURAL JOIN.

Warnung! Diese Lösung ist aus Sicht der Leistung nicht die beste. Es sollte unter Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 und höher funktionieren.

Einrichten:

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

Und fragen Sie:

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

Ausgabe:

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

DBFiddle Demo

lad2025
quelle