Рассмотрим следующую таблицу, где ни один из столбцов не имеет ограничения NULL
:
a | b | c | d
------+------+------+------
3 | 5 | 12 | NULL
NULL | 5 | 12 | NULL
13 | NULL | 26 | NULL
NULL | NULL | 26 | 4
6 | 7 | 5 | NULL
6 | NULL | NULL | NULL
6 | NULL | 5 | NULL
6 | 7 | NULL | NULL
NULL | NULL | NULL | NULL
(9 rows)
Все девять строк различны, но если мы примем NULL
как «подстановочный знак», то естьчто он может принимать любое значение, тогда только первая, третья, четвертая и пятая строки несомненно различимы.Поскольку все ненулевые значения других строк появляются в несомненно отличных строках, я хотел бы отбросить эти строки, чтобы получить следующую таблицу:
a | b | c | d
------+------+----+------
3 | 5 | 12 | NULL
13 | NULL | 26 | NULL
NULL | NULL | 26 | 4
6 | 7 | 5 | NULL
(4 rows)
В данной таблице как удалить строкичьи значения представляют подмножество значений другой строки в той же таблице?Другой способ задать этот вопрос: как можно дедуплицировать таблицу, используя NULL
в качестве подстановочного знака?
Не беспокойтесь об удалении фактически повторяющихся строк (именно поэтому я поставил «дедупликация» в кавычках взаглавие).В частности, я хотел бы иметь возможность делать это как в PostgreSQL, так и в Redshift.
Для справки, эти операторы создают исходную таблицу, описанную выше:
CREATE TABLE t (a int, b int, c int, d int);
INSERT INTO t
VALUES ( 3, 5, 12, NULL),
(NULL, 5, 12, NULL),
( 13, NULL, 26, NULL),
(NULL, NULL, 26, 4),
( 6, 7, 5, NULL),
( 6, NULL, NULL, NULL),
( 6, NULL, 5, NULL),
( 6, 7, NULL, NULL),
(NULL, NULL, NULL, NULL);