Почему в PostgreSQL (и, возможно, других движках) оператор UNION считает значения NULL одинаковыми, а ограничение UNIQUE - нет? - PullRequest
5 голосов
/ 20 апреля 2011

Я понимаю, что стандарт SQL допускает несколько значений NULL в столбце, который является частью ограничения UNIQUE.

Что я не понимаю, так это почему конструкция UNION (по крайней мере в PostgreSQL) обрабатывает NULLзначения как одинаковые.Например:

$ select * from tmp_a;
 a | b
---+---
 a | b
 a |
   |
(3 rows)

$ select * from tmp_b;
 a | b
---+---
 a | c
 a |
   |
(3 rows)

$ select a, b from tmp_a union select a, b from tmp_b order by 1, 2;
 a | b
---+---
 a | b
 a | c
 a |
   |
(4 rows)

Ответы [ 4 ]

3 голосов
/ 20 апреля 2011

Я не смог найти более первоисточник, но согласно этой статье в Википедии , существует особый случай для NULL, когда речь идет об операциях группировки.Для этих операций, таких как DISTINCT и UNION, NULL "не отличается" от NULL, даже если два NULL также "не равны".

2 голосов
/ 20 апреля 2011

Общее правило в стандарте SQL-92 выглядит следующим образом:

13.1 «объявить курсор» (помните, ORDER BY является частью курсора) Общее правило 3b:

следующая специальная обработка нулевых значений.Независимо от того, считается ли значение ключа сортировки, которое является нулевым, большим или меньшим, чем ненулевое значение, определяется реализацией, но все значения ключа сортировки, которые являются нулевыми, должны либо считаться большими, чем все ненулевые значения, либо считаться меньшими, чем все ненулевые значения.-нулевые значения.

SQL-89 изложил то же самое немного яснее IMO:

Хотя x = y неизвестно, если оба x и yявляются значениями NULL, в контексте GROUP BY, ORDER BY и DISTINCT значение NULL идентично или является дубликатом другого значения NULL.

Я полагаю, что PostgreSQL выполняет сортировку для удаления дубликатов в соответствии с требованиями UNION и группирует значения NULL в соответствии со стандартами.

1 голос
/ 27 апреля 2011

Обработка нулей в SQL принципиально противоречива, а иногда и противоречива. Нет логически обоснованного поведения нулей в SQL. Вам просто нужно изучить различные правила, которые применяются в разных местах, и либо применять их, либо обходить их.

1 голос
/ 20 апреля 2011

На сайте SQLite есть интересная веб-страница с обзором различий между реализациями SQL.

...