Я выбираю некоторые объекты и их теги в Postgres. Схема довольно проста, три таблицы:
объекты id
теги id | object_id | tag_id
теги id | tag
Я присоединяюсь к таблицам следующим образом, используя array_agg
для агрегирования тегов в одном поле:
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
Однако, если объект не имеет тегов, Postgres возвращает это:
[ null ]
вместо пустого массива. Как я могу вернуть пустой массив, когда нет тегов? Я дважды проверял, что у меня нет возвращаемого нулевого тега.
aggregate docs говорят: "Функция coalesce может использоваться для замены нуля или пустого массива для нулевого значения, когда это необходимо". Я попробовал COALESCE(ARRAY_AGG(tags.tag)) as tags
, но он все равно возвращает массив с нулевым значением. Я попытался сделать второй параметр многочисленными вещами (например, COALESCE(ARRAY_AGG(tags.tag), ARRAY())
, но все они приводят к синтаксическим ошибкам.