Sto selezionando alcuni oggetti e i relativi tag in Postgres. Lo schema è abbastanza semplice, tre tabelle:Postgres restituisce [null] invece di [] per array_agg della tabella join
oggettiid
marcatureid | object_id | tag_id
tagid | tag
sto unendo i tavoli di questo tipo, utilizzando array_agg
per aggregare i tag in un campo:
SELECT objects.*,
array_agg(tags.tag) AS tags,
FROM objects
LEFT JOIN taggings ON objects.id = taggings.object_id
LEFT JOIN tags ON tags.id = taggings.tag_id
Tuttavia, se l'oggetto non ha tag, Postgres restituisce questo:
[ null ]
invece di un un array vuoto. Come posso restituire un array vuoto quando non ci sono tag? Ho ricontrollato che non ho restituito un tag nullo.
Il aggregate docs dice "La funzione di coalesce può essere utilizzata per sostituire zero o un array vuoto per null quando necessario". Ho provato COALESCE(ARRAY_AGG(tags.tag)) as tags
ma restituisce ancora una matrice con null. Ho provato a fare il secondo parametro numerose cose (come COALESCE(ARRAY_AGG(tags.tag), ARRAY())
, ma tutte causano errori di sintassi
Ho scelto questa risposta, forse ingiustamente agli altri, perché comporta una modifica delle query molto inferiore e non mi interessa il caso del tag null qui. –
Questa è la risposta che ho usato anch'io, ma per coloro che desiderano saperne di più sul "perché", vedere la risposta di Patrick sotto insieme alla documentazione della funzione aggregata https://www.postgresql.org/docs/9.5/static/functions- aggregate.html –