列フィールドのいずれかがnullであるテーブル行から削除する


11

どの列がnullであるかを明示的に指定せずに、列フィールドのいずれかがnullであるテーブルから行を削除する方法はありますか?

私は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 | 

ありがとう

回答:


18

それには2つの方法があります。

単純な標準SQLでは、すべての列をリストし、それを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;

別の(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が何か違うことを否定する必要があります。これは、すべての列がnullである行にのみ一致します。

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

ありがとうございました!2つ目の解決策は、私が探していた解決策だと思います。
dhaliman


私は明確で簡潔な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デモ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.