jsonb trong Postgres 9.4+
Bạn có thể sử dụng cùng một truy vấn như bên dưới, chỉ với jsonb_array_elements() .
Nhưng thay vì sử dụng jsonb toán tử "chứa" @> kết hợp với chỉ mục GIN phù hợp trên biểu thức data->'objects' :
CREATE INDEX reports_data_gin_idx ON reports
USING gin ((data->'objects') jsonb_path_ops);
SELECT * FROM reports WHERE data->'objects' @> '[{"src":"foo.png"}]';
Kể từ khóa objects giữ một mảng JSON , chúng ta cũng cần đối sánh cấu trúc trong cụm từ tìm kiếm và bao bọc phần tử mảng vào dấu ngoặc vuông. Bỏ dấu ngoặc mảng khi tìm kiếm một bản ghi thuần túy.
Giải thích thêm và các tùy chọn:
- Chỉ mục để tìm một phần tử trong mảng JSON
json trong Postgres 9.3+
Bỏ kết hợp mảng JSON với hàm json_array_elements() trong một phép nối bên trong FROM mệnh đề và kiểm tra các phần tử của nó:
SELECT data::text, obj
FROM reports r, json_array_elements(r.data#>'{objects}') obj
WHERE obj->>'src' = 'foo.png';
db <> fiddle here
Sqlfiddle cũ
Hoặc, tương đương chỉ một đơn lẻ mức độ làm tổ:
SELECT *
FROM reports r, json_array_elements(r.data->'objects') obj
WHERE obj->>'src' = 'foo.png';
->> , -> và #> các toán tử được giải thích trong sách hướng dẫn.
Cả hai truy vấn đều sử dụng JOIN LATERAL ngầm định .
Liên quan chặt chẽ:
- Truy vấn cho phần tử của mảng trong cột JSON