sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan returnerer jeg en jsonb-array og en række objekter fra mine data?

Du behandler resultatet af den første join som JSON, ikke som tekststreng, så brug jsonb_each() i stedet for jsonb_each_text() :

SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM   mytable t
JOIN   LATERAL jsonb_each(t.data) a(k,v) ON a.k LIKE 'sales_%'
JOIN   LATERAL jsonb_to_recordset(a.v) d(yr text, value float) ON d.yr = '2012'
WHERE  t.employee = 'Jim'  -- works because employee is unique
GROUP  BY 1;

GROUP BY 1 er en forkortelse for GROUP BY t.employee .
Resultat:

employee | sales
---------+--------
Jim      | '{ "sales_tv" : 40, "sales_radio" : 76 }'

Jeg har også løst og forenklet din forespørgsel.

json_object_agg() er medvirkende til at aggregere navn/værdi-par som JSON-objekt. Cast eventuelt til jsonb hvis du har brug for det - eller brug jsonb_object_agg() i Postgres 9.5 eller nyere.

Bruger eksplicit JOIN syntaks for at vedhæfte betingelser på deres mest oplagte sted.
Det samme uden eksplicit JOIN syntaks:

SELECT t.employee, json_object_agg(a.k, d.value) AS sales
FROM   mytable t
     , jsonb_each(t.data)      a(k,v) 
     , jsonb_to_recordset(a.v) d(yr text, value float)
WHERE  t.employee = 'Jim'
AND    a.k LIKE 'sales_%'
AND    d.yr = '2012'
GROUP  BY 1;


  1. Gruppér efter måned og år i MySQL

  2. Postgresql trunkeringshastighed

  3. Sådan minimerer du RPO for dine PostgreSQL-databaser ved hjælp af punkt-i-tidsgendannelse

  4. Hvad er den bedste måde at vælge minimumsværdien fra flere kolonner?