sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera som array av JSON-objekt i SQL (Postgres)

json_build_object() i Postgres 9.4 eller senare

Eller jsonb_build_object() för att returnera jsonb .

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;

Manualen:

Bygger ett JSON-objekt av en variadisk argumentlista. Enligt konventionen består argumentlistan av alternerande nycklar och värden.

För alla versioner (inkl. Postgres 9.3)

row_to_json() med en ROW uttryck skulle göra susen:

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

Men du förlorar ursprungliga kolumnnamn. En cast till en registrerad radtyp undviker det. (Radtypen för en temporär tabell fungerar också för ad hoc-frågor.)

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;

Eller använd ett underval istället för ROW uttryck. Mer utförlig, men utan typavsnitt:

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;

Mer förklaring i Craigs relaterade svar:

  • PostgreSQL 9.2 row_to_json() med kapslade kopplingar

db<>spela här
Gammal sqlfiddle




  1. Hur man autoinkrementerar en varchar

  2. Ändra SQL Server-sortering till skiftlägesokänslig från skiftlägeskänslig?

  3. Oracle som lösning på muterande tabeller

  4. Gruppera mysql-fråga med 15 minuters intervall