1. ホーム
  2. postgresql

Postgres は、結合テーブルの array_agg に対して [] ではなく [null] を返します。

2023-09-20 08:14:19

質問

私はPostgresでいくつかのオブジェクトとそのタグを選択しています。スキーマはかなり単純で、3つのテーブルがあります。

オブジェクト 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 ]

は空の配列ではなく タグがないときに空の配列を返すにはどうしたらよいですか? nullタグが返されていないことを再確認しました。

アグリゲートドキュメント には、"coalesce関数は、必要に応じてゼロまたは空の配列をnullに置き換えるために使用することができます"と書かれています。試しに COALESCE(ARRAY_AGG(tags.tag)) as tags を試してみましたが、やはりnullの入った配列が返されます。第2パラメータを多数のものにしてみました(例えば COALESCE(ARRAY_AGG(tags.tag), ARRAY()) など)にしてみましたが、すべてシンタックスエラーになります。

どのように解決するのですか?

9.4 以降、集計関数の呼び出しを制限して、特定の基準に一致する行のみを処理させることができます。 array_agg(tags.tag) filter (where tags.tag is not null)