Hapus dari baris tabel di mana salah satu bidang kolom adalah nol

11

Apakah ada cara untuk menghapus baris dari tabel di mana salah satu kolom kolom adalah nol tanpa menentukan secara eksplisit kolom mana yang nol?

Saya menggunakan postgreSQL.

Inilah skema hubungan saya:

  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 | 

Terima kasih

dhaliman
sumber

Jawaban:

18

Saya melihat dua cara untuk melakukan itu:

Dengan SQL standar sederhana, cukup daftarkan semua kolom dan gabungkan dengan 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;

Solusi lain (spesifik Postgres) adalah perbandingan seluruh baris dengan NOT NULL

select *
from the_table
where the_table is not null;

akan mengembalikan hanya baris di mana semua kolom bukan nol. Anda menginginkan yang sebaliknya, jadi Anda harus meniadakan bahwa where not (the_table is not null)Ketentuannya where the_table is nulladalah sesuatu yang berbeda - yang hanya cocok dengan baris di mana semua kolom adalah nol.

delete from the_table
where not (the_table is not null);
seekor kuda tanpa nama
sumber
Terima kasih! Saya pikir solusi kedua adalah solusi yang saya cari.
dhaliman
3
itu cerdik
Jack mengatakan coba topanswers.xyz
Saya sangat suka pendekatan yang jelas dan ringkas where not (the_table is not null);. Terbaik yang bisa saya pikirkan dalam SQL umum NATURAL JOIN.
lad2025
0

Jika Anda tidak ingin menentukan setiap kolom yang dapat Anda gunakan NOT EXISTS ... NATURAL JOIN.

Peringatan! Solusi ini tidak terbaik dari sudut pandang kinerja. Ini harus bekerja pada Oracle / PostgreSQL / SQLite / MariaDB 10.3.2 dan di atas.

Pengaturan:

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

Dan kueri:

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

Keluaran:

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

Demo DBFiddle

Lad2025
sumber