PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да върна jsonb масив и масив от обекти от моите данни?

Вие третирате резултата от първото присъединяване като JSON, а не като текстов низ, така че използвайте jsonb_each() вместо 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 е съкращение за GROUP BY t.employee .
Резултат:

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

Освен това разплетех и опростих вашата заявка.

json_object_agg() играе важна роля за агрегирането на двойки име/стойност като JSON обект. По избор прехвърляне към jsonb ако имате нужда от това - или използвайте jsonb_object_agg() в Postgres 9.5 или по-нова версия.

Използване на изричен JOIN синтаксис за прикачване на условия на най-очевидното им място.
Същото без изричен JOIN синтаксис:

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. Как да открием заявка, която държи заключването в Postgres?

  2. PostgreSQL заявка за изброяване на всички имена на таблици?

  3. Промяна на типа данни на колона на сериен

  4. PostgreSQL:проблеми с кодирането на Windows при използване на помощната програма за команден ред psql

  5. Как да изброите всички бази данни с помощта на PostgreSQL