PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como faço para retornar uma matriz jsonb e uma matriz de objetos dos meus dados?


Você trata o resultado da primeira junção como JSON, não como string de texto, então use jsonb_each() em vez de 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 é um atalho para GROUP BY t.employee .
Resultado:
employee | sales
---------+--------
Jim      | '{ "sales_tv" : 40, "sales_radio" : 76 }'

Também desembaralhei e simplifiquei sua consulta.

json_object_agg() é fundamental na agregação de pares nome/valor como objeto JSON. Opcionalmente, converta para jsonb se você precisar disso - ou use jsonb_object_agg() no Postgres 9.5 ou posterior.

Usando JOIN explícito sintaxe para anexar condições em seu lugar mais óbvio.
O mesmo sem JOIN explícito sintaxe:
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;