PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Bagaimana cara mengembalikan array jsonb dan array objek dari data saya?

Anda memperlakukan hasil gabungan pertama sebagai JSON, bukan sebagai string teks, jadi gunakan jsonb_each() bukannya 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 adalah singkatan dari GROUP BY t.employee .
Hasil:

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

Saya juga menguraikan dan menyederhanakan kueri Anda.

json_object_agg() berperan penting dalam menggabungkan pasangan nama/nilai sebagai objek JSON. Secara opsional, transmisikan ke jsonb jika Anda membutuhkannya - atau gunakan jsonb_object_agg() di Postgres 9.5 atau lebih baru.

Menggunakan JOIN yang eksplisit sintaks untuk melampirkan kondisi di tempat yang paling jelas.
Sama tanpa JOIN yang eksplisit sintaks:

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. Kapan menggunakan tabel yang diwarisi di PostgreSQL?

  2. Ulangi dimensi array di plpgsql

  3. Bagaimana cara saya bekerja dengan desimal presisi tinggi di PHP

  4. Fungsi dengan kueri SQL tidak memiliki tujuan untuk data hasil

  5. Lewati beberapa nilai dalam parameter tunggal