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

Wie gebe ich ein jsonb-Array und ein Array von Objekten aus meinen Daten zurück?

Sie behandeln das Ergebnis des ersten Joins als JSON, nicht als Textstring, also verwenden Sie jsonb_each() statt 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 ist eine Abkürzung für GROUP BY t.employee .
Ergebnis:

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

Ich habe auch Ihre Abfrage entwirrt und vereinfacht.

json_object_agg() ist maßgeblich an der Aggregation von Name/Wert-Paaren als JSON-Objekt beteiligt. Optional in jsonb umwandeln wenn Sie das brauchen - oder verwenden Sie jsonb_object_agg() in Postgres 9.5 oder höher.

Verwendung von explizitem JOIN Syntax, um Bedingungen an ihrer offensichtlichsten Stelle anzufügen.
Dasselbe ohne explizites JOIN Syntax:

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;