残念ながら、SQL構文には「この1列を除くすべての列」と言う規定はありません。行タイプの式の残りの列のリストを綴ることにより、目標を達成できます。
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
より明示的な形式の略です。 ROW
(b.col1, b.col2, b.col3)
ただし、列名は行タイプの式では保持されません。このようにして、JSONオブジェクトで汎用キー名を取得します。元の列名を保持するための3つのオプションがあります。
1.登録済みタイプへのキャスト
既知の(登録済み)行タイプにキャストします。タイプは、既存のすべてのテーブルまたはビューに対して、または明示的なCREATE TYPE
ステートメントを使用して登録されます。アドホックソリューションの一時テーブルを使用することがあります(セッションの期間中有効です):
CREATE TEMP TABLE x (col1 int, col2 text, col3 date); -- use adequate data types!
SELECT a.id, a.name
, json_agg((b.col1, b.col2, b.col3)::x) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
2.副選択を使用する
副選択を使用して、派生テーブルを作成し、テーブル全体を参照します。これには列名も含まれます。より冗長ですが、登録されたタイプは必要ありません。
SELECT a.id, a.name
, json_agg((SELECT x FROM (SELECT b.col1, b.col2, b.col3) AS x)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
SELECT a.id, a.name
, json_agg(json_build_object('col1', b.col1, 'col2', b.col2, 'col3', b.col3)) AS item
FROM a
JOIN b ON b.item_id = a.id
GROUP BY a.id, a.name;
関連:
jsonb
それぞれの関数jsonb_agg()
およびについても同様ですjsonb_build_object()
。
以下のためのPostgres 9.5以降をも参照a_horseの答えを、新たな短い構文の変種で:Postgresは追加マイナスオペレータ-
のためjsonb
言って、「この1つのキーを除くすべてのキーを」。
以来、Postgresの10 「複数のキーを除いて、」同じオペレータ撮影を用いて実施されるtext[]
第2オペランドとして- MLTは、コメント等が挙げられます。