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)