PostgreSQLのARRAY_AGGは対象行が0件だとNULLを返す

  • PostgreSQL
  • SQL

この記事は、構成と文章の整理にAIを使っています。
あくまで読みやすくするための補助で、内容そのものをAIにすべて任せて書いているわけではありませんが、ところどころ相談しながら整えています。

ARRAY_AGGはPostgreSQLの集約関数で、複数行の値を1つの配列にまとめてくれる。GROUP BYと組み合わせて使うことが多い。

基本の使い方

SELECT department, ARRAY_AGG(employee_name)
FROM employees
GROUP BY department;

部署ごとに従業員名を配列にまとめる、みたいなやつ。他の集約関数(COUNT, SUMとか)と同じ感覚で使える。

順序は保証されない

ARRAY_AGGで集約される値の順番は、デフォルトだと保証されない。順番を固定したいなら関数の中にORDER BYを書く。

SELECT department, ARRAY_AGG(employee_name ORDER BY employee_name)
FROM employees
GROUP BY department;

WHEREとか外側のORDER BYで並べ替えても、集約前に順番が変わる可能性があるので意味がない。並び順が欲しいなら必ず関数内で指定する。

対象行が0件だとNULLになる

これが地味にハマりどころ。SUMが対象行0件で0じゃなくNULLを返すのと同じで、ARRAY_AGGも対象行が0件だと空配列{}ではなくNULLを返す。

空配列がほしい場合はCOALESCEで補う。

SELECT department, COALESCE(ARRAY_AGG(employee_name), '{}')
FROM employees
GROUP BY department;

配列前提でアプリ側のコードを書いていると、NULLが来て落ちることがあるので注意。

NULL値の扱い

集約対象の列にNULLが含まれている場合、デフォルトではその NULL も配列の要素として含まれる。除外したいならWHERE employee_name IS NOT NULLのように事前に絞る必要がある。