Обсуждение: 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)