Удалить из строк таблицы, где любое из полей столбца является нулевым

11

Есть ли способ удалить строку из таблицы, где любое из полей столбца является нулевым, не указывая явно, какой столбец является нулевым?

Я использую PostgreSQL.

Вот моя схема отношений:

  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 | 

Спасибо

dhaliman
источник

Ответы:

18

Я вижу два способа сделать это:

С простым стандартным SQL, просто перечислите все столбцы и объедините это с ИЛИ:

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;

Другое (специфичное для Postgres) решение - сравнение всей строки с NOT NULL

select *
from the_table
where the_table is not null;

вернет только те строки, где все столбцы не равны NULL. Вы хотите обратное, поэтому вам нужно отрицать, что where not (the_table is not null)Условие where the_table is nullявляется чем-то другим - это соответствует только строкам, в которых все столбцы равны нулю.

delete from the_table
where not (the_table is not null);
a_horse_with_no_name
источник
Спасибо! Я думаю, что второе решение - это решение, которое я искал.
Далиман
3
это гениально,
говорит Джек, попробуйте topanswers.xyz
Мне очень нравится четкий и лаконичный where not (the_table is not null);подход. Лучшее, что я могу думать о SQL в целом NATURAL JOIN.
lad2025
0

Если вы не хотите указывать каждый столбец, который вы можете использовать NOT EXISTS ... NATURAL JOIN.

Предупреждение! Это решение не является лучшим с точки зрения производительности. Он должен работать на Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 и выше.

Настройка:

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

И запрос:

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

Вывод:

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

DBFiddle Demo

lad2025
источник