

PostgreSQLのARRAY_AGGは対象行が0件だとNULLを返す
この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。
ARRAY_AGGはPostgreSQLの集約関数で、複数行の値を1つの配列にまとめてくれる。GROUP BYと組み合わせて使うことが多い。
基本の使い方
SELECT department, ARRAY_AGG(employee_name)FROM employeesGROUP BY department;部署ごとに従業員名を配列にまとめる、みたいなやつ。他の集約関数(COUNT, SUMとか)と同じ感覚で使える。
順序は保証されない
ARRAY_AGGで集約される値の順番は、デフォルトだと保証されない。順番を固定したいなら関数の中にORDER BYを書く。
SELECT department, ARRAY_AGG(employee_name ORDER BY employee_name)FROM employeesGROUP BY department;WHEREとか外側のORDER BYで並べ替えても、集約前に順番が変わる可能性があるので意味がない。並び順が欲しいなら必ず関数内で指定する。
対象行が0件だとNULLになる
これが地味にハマりどころ。SUMが対象行0件で0じゃなくNULLを返すのと同じで、ARRAY_AGGも対象行が0件だと空配列{}ではなくNULLを返す。
空配列がほしい場合はCOALESCEで補う。
SELECT department, COALESCE(ARRAY_AGG(employee_name), '{}')FROM employeesGROUP BY department;配列前提でアプリ側のコードを書いていると、NULLが来て落ちることがあるので注意。
NULL値の扱い
集約対象の列にNULLが含まれている場合、デフォルトではその NULL も配列の要素として含まれる。除外したいならWHERE employee_name IS NOT NULLのように事前に絞る必要がある。