sql >> Database >  >> RDS >> PostgreSQL

Hoe retourneer ik een jsonb-array en een array met objecten uit mijn gegevens?

Je behandelt het resultaat van de eerste join als JSON, niet als tekststring, dus gebruik jsonb_each() in plaats van 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 is een afkorting voor GROUP BY t.employee .
Resultaat:

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

Ik heb je vraag ook ontward en vereenvoudigd.

json_object_agg() speelt een belangrijke rol bij het aggregeren van naam/waarde-paren als JSON-object. Optioneel casten naar jsonb als je dat nodig hebt - of gebruik jsonb_object_agg() in Postgres 9.5 of hoger.

Expliciete JOIN gebruiken syntaxis om voorwaarden op hun meest voor de hand liggende plaats toe te voegen.
Hetzelfde zonder expliciete JOIN syntaxis:

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. Oracle WHILE LOOP Voorbeeld

  2. MySQL-vergelijking met null-waarde

  3. Libreoffice installeren op Ubuntu 16.04

  4. Schaaloplossingen voor MySQL (replicatie, clustering)