PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak zwrócić tablicę jsonb i tablicę obiektów z moich danych?

Traktujesz wynik pierwszego połączenia jako JSON, a nie jako ciąg tekstowy, więc użyj jsonb_each() zamiast 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 to skrót od GROUP BY t.employee .
Wynik:

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

Rozwikłałem i uprościłem również twoje zapytanie.

json_object_agg() służy do agregowania par nazwa/wartość jako obiektu JSON. Opcjonalnie przesyłaj do jsonb jeśli tego potrzebujesz - lub użyj jsonb_object_agg() w Postgresie 9.5 lub nowszym.

Używanie jawnego JOIN składnia dołączania warunków w ich najbardziej oczywistym miejscu.
To samo bez wyraźnego JOIN składnia:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Uzyskaj numer tygodnia z daty w PostgreSQL

  2. Psycopg2 Wstaw do tabeli z symbolami zastępczymi

  3. Radzenie sobie z powolnymi zapytaniami w PostgreSQL

  4. Zmień kolumny PostgreSQL używane w widokach

  5. Przyznaj wszystko w określonym schemacie w bazie danych do roli grupowej w PostgreSQL