Malheureusement, il n'y a aucune disposition dans la syntaxe SQL pour dire "toutes les colonnes sauf celle-ci" . Vous pouvez atteindre votre objectif en précisant la liste restante des colonnes dans une expression de type ligne :
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;
C'est court pour la forme plus explicite: . ROW
(b.col1, b.col2, b.col3)
Cependant, les noms de colonnes ne sont pas conservés dans les expressions de type ligne. Vous obtenez ainsi des noms de clé génériques dans l'objet JSON. Je vois 3 options pour conserver les noms de colonnes d'origine:
1. Cast au type enregistré
Cast sur un type de ligne bien connu (enregistré). Un type est enregistré pour chaque table ou vue existante ou avec une CREATE TYPE
instruction explicite . Vous pouvez utiliser une table temporaire pour une solution ad-hoc (vit pour la durée de la session):
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. Utilisez une sous-sélection
Utilisez une sous-sélection pour construire une table dérivée et référencer la table dans son ensemble . Cela porte également des noms de colonne. Il est plus détaillé, mais vous n'avez pas besoin d'un type enregistré:
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;
3. json_build_object()
dans Postgres 9.4 ou version ultérieure
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;
En relation:
Similaire pour jsonb
les fonctions respectives jsonb_agg()
et jsonb_build_object()
.
Pour Postgres 9.5 ou version ultérieure, voir également la réponse de a_horse avec une nouvelle variante de syntaxe plus courte: Postgres a ajouté l' opérateur moins -
pourjsonb
dire "toutes les clés sauf celle-ci" .
Étant donné que Postgres 10 "sauf plusieurs touches" est implémenté avec le même opérateur prenant text[]
comme commentaire le 2ème opérande comme mlt.