Une autre option pourrait être array_remove(..., NULL) (introduit dans 9.3
) si tags.tag est NOT NULL (sinon vous voudrez peut-être garder NULL valeurs dans le tableau, mais dans ce cas, vous ne pouvez pas faire la distinction entre un seul NULL existant balise et un NULL balise due à la 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
Si aucune balise n'est trouvée, un tableau vide est renvoyé.