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

tidak mengerti json_agg dalam konteks ini

Saya percaya LATERAL JOIN melakukan trik di sana. Dalam kueri asli Anda, Anda menggunakan json_agg terhadap seluruh kumpulan data tabel (difilter berdasarkan '{"kind":"person"}' )

with a  as 
    (
        select jsonb_array_elements(s.payload) j 
        from segments s
    )
SELECT  json_agg(a.j) AS filtered_payload 
from a
where j @> '{"kind":"person"}';

Sementara itu pada contoh kedua, Anda bermain dengan satu baris pada saat menggunakan LATERAL . Itu sebabnya Anda akhirnya memiliki 3 baris dengan satu "kind":"person" nilai, bukan baris unik dengan 3 nilai.

Tidak yakin dengan apa yang ingin Anda capai, tetapi hal berikut ini dapat mengarahkan Anda ke arah yang benar

SELECT a.filtered_payload,
    a.ct_elem_row, 
    sum(ct_elem_row) OVER () AS ct_elem_total, 
    count(*)         OVER () AS ct_rows
FROM segments s
 JOIN LATERAL (
    SELECT json_agg(j.elem) AS filtered_payload, 
        count(*) AS ct_elem_row
    FROM   segments d, lateral jsonb_array_elements(d.payload) j(elem)
    WHERE  j.elem @> '{"kind":"person"}'
    ) a ON ct_elem_row > 0
WHERE  s.payload @> '[{"kind":"person"}]';

Hasil

                                            filtered_payload                                            | ct_elem_row | ct_elem_total | ct_rows
--------------------------------------------------------------------------------------------------------+-------------+---------------+---------
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
 [{"kind": "person", "limit": "1"}, {"kind": "person", "limit": "3"}, {"kind": "person", "limit": "2"}] |           3 |             9 |       3
(3 rows)



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan Protokol PostgreSQL. Penyiapan sesi gagal.. kesalahan

  2. Bisakah Sqlalchemy bekerja dengan baik dengan beberapa file database SQLite terlampir?

  3. Hapus duplikat di postgres

  4. dapatkah Anda menggunakan perpustakaan di PL/Perl

  5. Pemetaan JPA Multi-Baris dengan ElementCollection