it-swarm.com.de

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

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

11
dhaliman

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 all Spalten nicht null sind. Sie wollen das Gegenteil, also müssen Sie negieren, dass where not (the_table is not null) Die Bedingung where the_table is null Ist etwas anderes - das stimmt nur mit Zeilen überein, in denen alle Spalten null sind.

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

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

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

0
lad2025