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

Truy vấn cho các phần tử mảng bên trong kiểu JSON

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';

->> , ->#> 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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để đặt khóa chính tự động tăng dần trong PostgreSQL?

  2. Trong psql, tại sao một số lệnh không có tác dụng?

  3. Tìm các chuỗi tương tự với PostgreSQL một cách nhanh chóng

  4. Đặc quyền siêu người dùng mặc định của postgres bị xóa vô tình - tôi có thể lấy lại không?

  5. PostgreSQL chuyển dữ liệu từ CTE đệ quy vào hàm