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