Xóa khỏi các hàng của bảng trong đó bất kỳ trường cột nào là null


11

Có cách nào để xóa một hàng khỏi bảng trong đó bất kỳ trường cột nào là null mà không chỉ định rõ ràng cột nào là null không?

Tôi đang sử dụng postgreSQL.

Đây là lược đồ quan hệ của tôi:

  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 | 

Cảm ơn

Câu trả lời:


18

Tôi thấy hai cách để làm điều đó:

Với SQL tiêu chuẩn đơn giản, chỉ cần liệt kê tất cả các cột và kết hợp nó với 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;

Một giải pháp khác (cụ thể của Postgres) là so sánh toàn bộ hàng với NOT NULL

select *
from the_table
where the_table is not null;

sẽ chỉ trả về các hàng trong đó tất cả các cột không phải là null. Bạn muốn điều ngược lại, vì vậy bạn cần phủ nhận rằng where not (the_table is not null)Điều kiện where the_table is nulllà một cái gì đó khác biệt - chỉ khớp với các hàng trong đó tất cả các cột là null.

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

Cảm ơn bạn! Tôi nghĩ giải pháp thứ hai là giải pháp mà tôi đang tìm kiếm.
dhaliman


Tôi thực sự thích where not (the_table is not null);cách tiếp cận rõ ràng và súc tích . Tốt nhất những gì tôi có thể nghĩ về SQL nói chung là NATURAL JOIN.
lad2025

0

Nếu bạn không muốn chỉ định từng cột bạn có thể sử dụng NOT EXISTS ... NATURAL JOIN.

Cảnh báo! Giải pháp này không phải là tốt nhất từ ​​quan điểm hiệu suất. Nó nên hoạt động trên Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 trở lên.

Đang cài đặt:

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

Và truy vấn:

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

Đầu ra:

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

Trình diễn DBFiddle

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.