sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur returnerar jag en jsonb-array och en array av objekt från mina data?

Du behandlar resultatet av den första joinen som JSON, inte som textsträng, så använd jsonb_each() istället för 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 är en förkortning för GROUP BY t.employee .
Resultat:

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

Jag har också redit ut och förenklat din fråga.

json_object_agg() är avgörande för att aggregera namn/värdepar som JSON-objekt. Valfritt casta till jsonb om du behöver det - eller använd jsonb_object_agg() i Postgres 9.5 eller senare.

Använder explicit JOIN syntax för att bifoga villkor på deras mest uppenbara plats.
Samma utan uttrycklig 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;


  1. Inkludera saknade månader i grupp efter fråga

  2. Hur säkerhetskopierar man en postgresql-databas inifrån psql?

  3. Ändra en CHECK-begränsning i SQL Server med T-SQL

  4. Fönsterfunktioner eller vanliga tabelluttryck:räkna tidigare rader inom intervallet