Вопрос про GROUP BY

big-trot
Дата: 21.01.2015 09:52:18
Почему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
WITH t1 (f1,f2) AS (
	VALUES (1,1)
    , (1, 2)
    , (1, 3)
    , (NULL, 4)
    , (NULL, 5)
    , (NULL, 6)
    , (2, 7)
    , (2, 8)
    , (2, 9)
)
SELECT f1, sum (f2)
FROM t1
GROUP BY 1

Результат равен
f1 sum
NULL 15
1 6
2 24

Хотя ожидалось, что будет
f1 sum

1 6
2 24

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.
Павел Лузанов
Дата: 21.01.2015 17:38:38
big-trot,

Посмотри в этой дискуссии:
Ivan Durak
Дата: 23.01.2015 09:45:36
big-trot
Почему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
WITH t1 (f1,f2) AS (
	VALUES (1,1)
    , (1, 2)
    , (1, 3)
    , (NULL, 4)
    , (NULL, 5)
    , (NULL, 6)
    , (2, 7)
    , (2, 8)
    , (2, 9)
)
SELECT f1, sum (f2)
FROM t1
GROUP BY 1

Результат равен
f1 sum
NULL 15
1 6
2 24

Хотя ожидалось, что будет
f1 sum

1 6
2 24

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.

нул не равен нул, но для группировки делается исключение, причем везде и всегда и во всех субд.
Ivan Durak
Дата: 23.01.2015 09:46:26
еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны
этта
Дата: 23.01.2015 10:05:09
Ivan Durak
еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны

вы не путаете пж с мс-скл ?
big-trot
Дата: 23.01.2015 15:54:47
Спасибо.
Ivan Durak
еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны

Для ПЖ это ограничение не действует, можно вполне вставлять не одно значение NULL в поле, на которое наложено ограничение уникальности.
Ivan Durak
Дата: 23.01.2015 17:52:10
big-trot
Спасибо.
Ivan Durak
еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны

Для ПЖ это ограничение не действует, можно вполне вставлять не одно значение NULL в поле, на которое наложено ограничение уникальности.

да индекс с мсскл перепутал, думал тут также.
Ну дистинкт-то точно один null оставляет !!
Ivan Durak
Дата: 23.01.2015 17:55:10
big-trot
Почему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
WITH t1 (f1,f2) AS (
	VALUES (1,1)
    , (1, 2)
    , (1, 3)
    , (NULL, 4)
    , (NULL, 5)
    , (NULL, 6)
    , (2, 7)
    , (2, 8)
    , (2, 9)
)
SELECT f1, sum (f2)
FROM t1
GROUP BY 1

Результат равен
f1 sum
NULL 15
1 6
2 24

Хотя ожидалось, что будет
f1 sum

1 6
2 24

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.

а "почему так" вопрос клевый.
Почему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?
Павел Лузанов
Дата: 23.01.2015 18:24:46
Ivan Durak
Почему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?

В oracle еще в 90-х годах планировали сделать, чтобы пустая строка и null были не одно и тоже.
По крайней мере в статьях о нововведениях для будущих версий про это писали и рекомендовали готовиться.
Но так и не сделали.
Я подозреваю, что из-за того, что уже очень много кода пришлось бы переписывать в приложениях.
Думаю, это было бы покруче проблемы 2000 года, вот и оставили как есть.
Ы
Дата: 23.01.2015 18:26:54
Ivan Durak
Почему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?

Вопрос только в том, почему пустая строка эквивалентна NULL в Оракле. Почему она у остальных не эквивалентна, как раз понятно: ровно потому же, почему 0 (ноль) не эквивалентен NULL для числовых типов.