2017-12-30 49 views
2

Ich habe eine Tabelle mit drei Spalten: id, name und position. Ich möchte ein JSON-Array wie folgt erstellen:Wie können Sie eine Projektion mit array_agg (order by) machen?

[ 
    {"id": 443, "name": "first"}, 
    {"id": 645, "name": "second"} 
] 

Dies wird durch die position Spalte aufgeführt werden sollte.

begann ich mit der folgenden Abfrage:

with output as 
(
    select id, name 
    from the_table 
) 
select array_to_json(array_agg(output)) 
from output 

Dies funktioniert, groß. Jetzt möchte ich die Reihenfolge hinzufügen. Ich begann mit diesem:

with output as 
(
    select id, name, position 
    from the_table 
) 
select array_to_json(array_agg(output order by output.position)) 
from output 

Jetzt ist die Ausgabe wie folgt:

[ 
    {"id": 443, "name": "first", "position": 1}, 
    {"id": 645, "name": "second", "position": 2} 
] 

Aber ich will nicht das position Feld in der Ausgabe.

Ich bin mit einem Henne-Ei-Problem konfrontiert: Ich brauche die position Spalte in der Lage zu bestellen, aber ich will auch nicht die position Spalte, wie ich es nicht in der Ergebnisausgabe wollen.

Wie kann ich das beheben?

Ich glaube nicht, dass die folgende Abfrage richtig ist, wie die Reihenfolge der Tabellen (theoretisch) nicht zwischen Anfragen erhalten:

with output as 
(
    select id, name 
    from  the_table 
    order by position 
) 
select array_to_json(array_agg(output)) 
from output 

Antwort

1

Es gibt zwei Möglichkeiten (mindestens):

Build-JSON-Objekt :

with t(x,y) as (values(1,1),(2,2)) 
select json_agg(json_build_object('x',t.x) order by t.y) from t; 

oder unnötige Schlüssel löschen:

with t(x,y) as (values(1,1),(2,2)) 
select json_agg((to_jsonb(t)-'y')::json order by t.y) from t; 

Beachten Sie, dass Sie im zweiten Fall einige Typumwandlungen benötigen, da der Operator - nur für den Typ JSONB definiert ist.

Beachten Sie auch, dass ich direkt JSON Aggregation json_agg() statt Paar array_to_json(array_agg())

+0

verwendet das ist schön, danke. Kann die Projektion auch nur mit einer SQL-Abfrage durchgeführt werden und anschließend 'json_agg' anwenden? –

+0

@CarolineKwerts 'mit t (x, y) als (Werte (1,1), (2,2)) json_agg (t) aus t auswählen;'? – Abelisto

+0

danke :) smarte Lösung –