From: | Alexey Klyukin <alexeyk(at)me(dot)com> |
---|---|
To: | "Dmitry E(dot) Oboukhov" <unera(at)debian(dot)org> |
Cc: | pgsql-ru-general(at)postgresql(dot)org |
Subject: | Re: [pgsql-ru-general] Аггрегаторные функции: исключить NULL |
Date: | 2011-11-16 15:02:10 |
Message-ID: | DCB7872C-5308-47D3-B665-7011C19E2FA1@me.com |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-ru-general |
On Nov 14, 2011, at 1:01 PM, Dmitry E. Oboukhov wrote:
> SELECT
> "t1".id,
> COUNT("t2"."id") AS "count",
> array_agg("t2"."id") AS "ids"
> FROM
> "t1"
> LEFT JOIN "t2" ON "t2"."t1_id" = "t1"."id"
>
> GROUP BY
> "t1"."id"
>
> Возвращает
>
> id | count | ids |
> 1 | 0 | {NULL} |
> 2 | 2 | {2,6} |
> 3 | 4 | {1,2,3,4} |
>
>
> Есть ли простой способ в третьем столбике исключить {NULL}?
Что если добавлять значения в строку (используя разделитель, которого заведомо нет в исходных данных), а потом разворачивать их обратно в массив?
regexp_split_to_array(string_agg("t2".id,','),',') as "ids"
Более производительный и надежный способ написать свою агрегирующую функцию:
см. http://www.postgresql.org/docs/current/static/sql-createaggregate.html.
sfunc в данном случае должна просто вызывать array_append для не-нулевых данных.
/A
From | Date | Subject | |
---|---|---|---|
Next Message | Andrey N. Oktyabrski | 2011-11-16 20:00:02 | Re: Аггрегаторные функции: исключить NULL |
Previous Message | Dmitry E. Oboukhov | 2011-11-16 13:15:56 | Re: Аггрегаторные функции: исключить NULL |