Re: Contradictory behavior of array_agg(distinct) aggregate.
От | Dagfinn Ilmari Mannsåker |
---|---|
Тема | Re: Contradictory behavior of array_agg(distinct) aggregate. |
Дата | |
Msg-id | 874j3j7nj0.fsf@wibble.ilmari.org обсуждение исходный текст |
Ответ на | Re: Contradictory behavior of array_agg(distinct) aggregate. (Konstantin Knizhnik <knizhnik@garret.ru>) |
Список | pgsql-hackers |
Konstantin Knizhnik <knizhnik@garret.ru> writes: > On 04/12/2024 9:03 am, Tom Lane wrote: >> Konstantin Knizhnik <knizhnik@garret.ru> writes: >>> postgres=# create table t(x integer unique); >>> CREATE TABLE >>> postgres=# insert into t values (null),(null); >>> INSERT 0 2 >>> postgres=# select count(distinct x) from t; >>> count >>> ------- >>> 0 >>> (1 row) >>> postgres=# select array_agg(distinct x) from t; >>> array_agg >>> ----------- >>> {NULL} >>> (1 row) >>> postgres=# select array_agg(x) from t; >>> array_agg >>> ------------- >>> {NULL,NULL} >>> (1 row) >> I see nothing contradictory here. "array_agg(distinct x)" >> combines the two NULLs into one, which is the normal >> behavior of DISTINCT. > > > Sorry. > It is actually inconsistency in basic SQL model in interpretation of > NULL by UNIQUE and DISTINCT, and array_agg just follows this rule. The behaviour of DISTINCT in aggregates matches the behaviour of the IS (NOT) DISTINCT FROM predicate, which considers NULLs NOT DISTINCT from eachother. UNIQUE constraints leave it implementation-defined whether NULLs are considered distinct (PostgreSQL defaults to NULLS DISTINCT), but that can be overridden in the constraint definition. - ilmari
В списке pgsql-hackers по дате отправления: