Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос про GROUP BY / 16 сообщений из 16, страница 1 из 1
21.01.2015, 09:52
    #38859274
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Почему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.
...
Рейтинг: 0 / 0
21.01.2015, 17:38
    #38859975
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
big-trot,

Посмотри в http://www.postgresql.org/message-id/199907071823.OAA05656@candle.pha.pa.us]этой дискуссии:
...
Рейтинг: 0 / 0
23.01.2015, 09:45
    #38861398
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
big-trotПочему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.
нул не равен нул, но для группировки делается исключение, причем везде и всегда и во всех субд.
...
Рейтинг: 0 / 0
23.01.2015, 09:46
    #38861401
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны
...
Рейтинг: 0 / 0
23.01.2015, 10:05
    #38861420
этта
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Ivan Durakеще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны
вы не путаете пж с мс-скл ?
...
Рейтинг: 0 / 0
23.01.2015, 15:54
    #38861873
big-trot
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Спасибо.
Ivan Durak еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны
Для ПЖ это ограничение не действует, можно вполне вставлять не одно значение NULL в поле, на которое наложено ограничение уникальности.
...
Рейтинг: 0 / 0
23.01.2015, 17:52
    #38862007
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
big-trotСпасибо.
Ivan Durak еще так же например в уникальном индексе второй нул не вставишь, хотя они и не равны, но эквивалентны
Для ПЖ это ограничение не действует, можно вполне вставлять не одно значение NULL в поле, на которое наложено ограничение уникальности.
да индекс с мсскл перепутал, думал тут также.
Ну дистинкт-то точно один null оставляет !!
...
Рейтинг: 0 / 0
23.01.2015, 17:55
    #38862012
Ivan Durak
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
big-trotПочему выполняется группирование по группе NULL, ведь NULL не равен NULL, а при группировании вроде они становятся равны.
Пример
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
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

В документации объяснений не нашел (либо плохо искал).
Объясните, почему так.
Спасибо.
а "почему так" вопрос клевый.
Почему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?
...
Рейтинг: 0 / 0
23.01.2015, 18:24
    #38862028
Павел Лузанов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Ivan DurakПочему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?
В oracle еще в 90-х годах планировали сделать, чтобы пустая строка и null были не одно и тоже.
По крайней мере в статьях о нововведениях для будущих версий про это писали и рекомендовали готовиться.
Но так и не сделали.
Я подозреваю, что из-за того, что уже очень много кода пришлось бы переписывать в приложениях.
Думаю, это было бы покруче проблемы 2000 года, вот и оставили как есть.
...
Рейтинг: 0 / 0
23.01.2015, 18:26
    #38862030
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Ivan DurakПочему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна?
Вопрос только в том, почему пустая строка эквивалентна NULL в Оракле. Почему она у остальных не эквивалентна, как раз понятно: ровно потому же, почему 0 (ноль) не эквивалентен NULL для числовых типов.
...
Рейтинг: 0 / 0
23.01.2015, 22:00
    #38862105
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
ЫIvan DurakПочему в пг и прочих '' (пустая строка) не эквивалентна нулу, а в оракле эквивалентна? Вопрос только в том, почему пустая строка эквивалентна NULL в Оракле. Вот — документация их : докиA row fully contained in one block has at least 3 bytes of row header. After the row header information, each row contains column length and data. The column length requires 1 byte for columns that store 250 bytes or less , or 3 bytes for columns that store more than 250 bytes, and precedes the column data . Space required for column data depends on the datatype. If the datatype of a column is variable length, then the space required to hold a value can grow and shrink with updates to the data. To conserve space, a null in a column only stores the column length (zero) . Oracle does not store data for the null column. Also, for trailing null columns, Oracle does not even store the column length. Я подчеркнул основные моменты. Они хранят данные в виде структуры <длина><данные>, т.е. сначала читается <длина> (которая занимает как минимум 1 байт даже для NULL значений), а потом уже данные. В связи с этим физическое хранение информации не дает возможным различить `длина=0` для пустой строки и `длина=0` для NULL-строки. Postgres хранит NULL-bitmap в заголовке записи , на каждую колонку отводиться 1 бит:
  • NULL-значения легко “отличаются” от любых других;
  • наличие NULL-значений не увеличивает длину записи, т.е. если в записи все колонки NULL, то физически будет сохранен только заголовок записи;
...
Рейтинг: 0 / 0
24.01.2015, 02:01
    #38862174
Ы
Ы
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
vyegorov,

я подозреваю, вопрос был, скорее, о том, почему в Оракле решили не различать NULL и пустую строку, чем как именно это сделано технически: то есть только ли «to conserve space», или еще какая-то была мысль.
...
Рейтинг: 0 / 0
24.01.2015, 10:18
    #38862230
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
Ывопрос был, скорее, о том, почему в Оракле решили не различать NULL и пустую строку, чем как именно это сделано технически: то есть только ли «to conserve space», или еще какая-то была мысль.
Мне кажется эти два момента связаны в случае с ORACLE.

В Postgres'е одной из неприятных процедур является установка новой мажорной версии, т.к. меняется формат хранения данных. Исторически единственным способом апгрейднуть базу был полный логический pg_dump + pg_restore. Начиная с 8.4 (если не ошибаюсь) есть утилита `pg_upgrade`, но она не будет работать, если измениться физический формат хранения данных.

В ORACLE формат не меняется десятилетиями. Туда привносят что-то новое, но все, что уже существует — не меняется. Апгрейд базы сводится к установке новых бинарников и апгрейду системного каталога. Чтобы научить Оракл различать пустые строки и NULL, нужно нарушить эту традицию (уж не знаю, прописана ли эта фича в лицензионном соглашении). Не думаю, что крупные клиенты буду рады геммору с логическим dump+restore петабайтных баз.

Почему так произошло? Первый коммерческий ORACLE вышел в 1979 году. Мне думается, что тогда либо не заморачивались, либо реляционная теория была слишком свежа (ведь наличие BCNF формы связано с тем, что Э.Кодд "это и имел в виду", но "не точно сформулировал" — это слова К.Дэйта на видео-семинаре O'Reily). Возможно использовали тот же подход, что был и в dBase-подобных базах — там тоже отсутствует NULL. Сейчас можно только гадать.

Но то, что физическая структура "заморожена" и приводит к тому, что эту "фичу" не исправляют.

Правда все Оракло-воды тут на работе искренне считают, что это нормальное поведение системы.
...
Рейтинг: 0 / 0
27.01.2015, 00:42
    #38863795
NikolayV81
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
vyegorov...
Правда все Оракло-воды тут на работе искренне считают, что это нормальное поведение системы.

Для Оракла как я понял весьма характерная ситуация, если почитать дискуссию о необходимости on update cascade для fk.

А проблема формата на мой взгляд решается добавлением заголовка, а так же добавлением нового стандартного типа varchar, и объявлением varchar2 как depricated, если бы это было сделано лет 5-10 назад, уже бы потихоньку бы переехали, но думаю тут есть пара вещей которые могут быть выгодны ораклу:
1. отличие в поведении основного типа добавляет сложности при переносе систем на "другую" СУБД
2. работа над поддержанием старого varchar2 ( от которого по объективным причинам не избавиться быстро ) и стандартного varchar стоит денег, а коммерческая выгода непонятна.
...
Рейтинг: 0 / 0
27.01.2015, 02:48
    #38863819
vyegorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про GROUP BY
NikolayV81vyegorov...
Правда все Оракло-воды тут на работе искренне считают, что это нормальное поведение системы.

Для Оракла как я понял весьма характерная ситуация, если почитать дискуссию о необходимости on update cascade для fk.

А проблема формата на мой взгляд решается добавлением заголовка, а так же добавлением нового стандартного типа varchar, и объявлением varchar2 как depricated, если бы это было сделано лет 5-10 назад, уже бы потихоньку бы переехали...

Да вот тут 2 мысли бегают: (1) они уже в логической ловушке, т.е. для существующих данных отличить NULL от пустой строки — невозможно да и (2) они искренне считают, что так и должно быть. Т.е. зачем что-то исправлять, все же и так замечательно!

Это похоже на то, как реагируют mysql-щики на поведение GROUP BY в других СУБД: “фу, почему так сложно, в mysql же все работало, а тут нельзя сделать `SELECT * FROM tab GROUP BY user_id`”. В случае с ORACLE крючок глубже. Я спорил на работе, приходилось все время уходить от СУБД вообще, в сторону теории. Так соглашаются, да, NULL отличен от всего. Но в ORACLE все хорошо…
...
Рейтинг: 0 / 0
27.01.2015, 06:48
    #38863856
Вопрос про GROUP BY
2 All
Раз уж в дискуссии затронули Oracle и тему отличия или неотличия в нем пустой строки и нулла, то предлагаю для повышения уровня образованности ознакомиться с вот этой темкой:
обсуждение про null и пустую строку в pl/sql-машине:

основные выводы с дампами чуть ниже...
...
Рейтинг: 0 / 0
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Вопрос про GROUP BY / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]