PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

không hiểu json_agg trong ngữ cảnh này

Tôi tin rằng LATERAL JOIN đang thực hiện thủ thuật ở đó. Trong truy vấn ban đầu của bạn, bạn đang sử dụng json_agg so với toàn bộ tập dữ liệu của bảng (được lọc theo '{"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"}';

Trong khi đó trong trường hợp thứ hai, bạn đang chơi với một hàng tại một thời điểm bằng cách sử dụng LATERAL . Đó là lý do tại sao bạn có 3 hàng với một "kind":"person" thay vì một hàng duy nhất có 3 giá trị.

Không chắc chắn về những gì bạn đang cố gắng đạt được nhưng những điều sau đây có thể đưa bạn đi đúng hướng

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"}]';

Kết quả

                                            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. Postgres CẬP NHẬT bằng chức năng cửa sổ xếp hạng

  2. Chèn ngắt dòng trong postgresql khi cập nhật trường văn bản

  3. Nhà cung cấp OleDB / ODBC tốt cho PostgreSQL

  4. Lỗi xác thực mật khẩu không thành công khi chạy di chuyển laravel

  5. Postgres cách triển khai cột được tính toán với mệnh đề