Обсуждение: Re: Аггрегаторные функции: исключить NULL
On 14.11.11 14:01, Dmitry E. Oboukhov wrote: > Есть ли простой способ в третьем столбике исключить {NULL}? INNER JOIN?
> On 14.11.11 14:01, Dmitry E. Oboukhov wrote: >> Есть ли простой способ в третьем столбике исключить {NULL}? > INNER JOIN? Нет, он исключит их и из выборки тоже. в выборке нужны NULL в некоторых местах. а вот в этом столбике нужны только id'шники без NULL (так же как COUNT считает) -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
> On 14.11.11 14:01, Dmitry E. Oboukhov wrote: >> Есть ли простой способ в третьем столбике исключить {NULL}? > INNER JOIN? то есть уточним задачу есть таблица users | id | ... | | 1 | ... | | 2 | ... | есть таблица users_messages | id | uid | message | | 1 | 1 | привет | | 2 | 1 | медвед | нужно выбрать пользователей из БД при этом в отдельный массив выбрать сообщения которые им предназначены. Если их нет, то массив должен быть пуст. SELECT user.*, array_agg(messages.message) AS messages FROM users AS user LEFT JOIN users_messages AS messages ON messages.uid = user.id WHERE "user"."id" IN (1, 2) GROUP BY user.id Выбирает в последний столбик либо массив сообщений которые есть, либо {NULL} если таковых нет. то есть будет выбрано нечто вроде | 1 | ... | {привет,медвед} | | 2 | ... | {NULL} | где ... - остальные поля в users -- . ''`. Dmitry E. Oboukhov : :’ : email: unera@debian.org jabber://UNera@uvw.ru `. `~’ GPGKey: 1024D / F8E26537 2006-11-21 `- 1B23 D4F8 8EC0 D902 0555 E438 AB8C 00CF F8E2 6537
Вложения
On 16.11.11 14:10, Dmitry E. Oboukhov wrote: >> On 14.11.11 14:01, Dmitry E. Oboukhov wrote: >>> Есть ли простой способ в третьем столбике исключить {NULL}? >> INNER JOIN? > > Нет, он исключит их и из выборки тоже. в выборке нужны NULL в > некоторых местах. а вот в этом столбике нужны только id'шники без NULL > (так же как COUNT считает) Оно? ano=# SELECT * from u; id ---- 1 2 3 (3 rows) ano=# SELECT * from m; id | uid ----+----- 1 | 2 2 | 2 3 | 3 (3 rows) ano=# SELECT u.id, CASE array_agg(m.id) WHEN '{NULL}' THEN '{}' ELSE array_agg(m.id) END AS m FROM u LEFT JOIN m ON m.uid = u.id WHERE u.id IN (1,2,3) GROUP BY u.id; id | m ----+------- 2 | {1,2} 1 | {} 3 | {3} (3 rows)