Outra opção pode ser
array_remove(..., NULL) (introduzido na versão 9.3
) se tags.tag é NOT NULL (caso contrário, você pode querer manter NULL valores na matriz, mas nesse caso, você não pode distinguir entre um único NULL existente tag e um NULL tag devido ao LEFT JOIN ):SELECT objects.*,
array_remove(array_agg(tags.tag), NULL) AS tags,
FROM objects
LEFT JOIN taggings ON objects.id = taggings.object_id
LEFT JOIN tags ON tags.id = taggings.tag_id
Se nenhuma tag for encontrada, uma matriz vazia será retornada.