sql >> Databáze >  >> RDS >> PostgreSQL

Jak vrátím pole jsonb a pole objektů z mých dat?

Výsledek prvního spojení považujete za JSON, nikoli za textový řetězec, takže použijte jsonb_each() místo 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 je zkratka pro GROUP BY t.employee .
Výsledek:

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

Také jsem rozmotala a zjednodušila váš dotaz.

json_object_agg() je nástroj pro agregaci párů název/hodnota jako objekt JSON. Volitelně přenést do jsonb pokud to potřebujete - nebo použijte jsonb_object_agg() v Postgresu 9.5 nebo novějším.

Použití explicitního JOIN syntaxe pro připojení podmínek na jejich nejviditelnějším místě.
Totéž bez explicitního JOIN syntaxe:

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. Jak zakázat všechna omezení kontroly v databázi SQL Server - SQL Server / TSQL výukový program, část 87

  2. Podpora výkonu v nastavení hybridního cloudu

  3. Oracle:jak získat procento z celkového počtu dotazem?

  4. Zakázat ONLY_FULL_GROUP_BY