PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rückgabe als Array von JSON-Objekten in SQL (Postgres)

json_build_object() in Postgres 9.4 oder neuer

Oder jsonb_build_object() um jsonb zurückzugeben .

SELECT value_two, json_agg(json_build_object('value_three', value_three
                                           , 'value_four' , value_four)) AS value_four
FROM   mytable 
GROUP  BY value_two;

Das Handbuch:

Erstellt ein JSON-Objekt aus einer variadischen Argumentliste. Per Konvention besteht die Argumentliste aus abwechselnden Schlüsseln und Werten.

Für jede Version (einschließlich Postgres 9.3)

row_to_json() mit einer ROW Ausdruck würde den Zweck erfüllen:

SELECT value_two
     , json_agg(row_to_json((value_three, value_four))) AS value_four
FROM   mytable
GROUP  BY value_two;

Aber Sie verlieren die ursprünglichen Spaltennamen. Eine Umwandlung in einen registrierten Zeilentyp vermeidet dies. (Der Zeilentyp einer temporären Tabelle dient auch für Ad-hoc-Abfragen.)

CREATE TYPE foo AS (value_three text, value_four text);  -- once in the same session
SELECT value_two
     , json_agg(row_to_json((value_three, value_four)::foo)) AS value_four
FROM   mytable
GROUP  BY value_two;

Oder verwenden Sie eine Unterauswahl anstelle von ROW Ausdruck. Ausführlicher, aber ohne Typumwandlung:

SELECT value_two
     , json_agg(row_to_json((SELECT t FROM (SELECT value_three, value_four) t))) AS value_four
FROM   mytable
GROUP  BY value_two;

Weitere Erklärungen in Craigs zugehöriger Antwort:

  • PostgreSQL 9.2 row_to_json() mit verschachtelten Joins

db<>hier fummeln
Altes sqlfiddle