Cách tạo chỉ mục trên trường json trong Postgres 9.3


111

Trong PostgreSQL 9.3 Beta 2 (?), Làm cách nào để tạo chỉ mục trên trường JSON? Tôi đã thử sử dụng ->toán tử được sử dụng cho hstorenhưng gặp lỗi sau:

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));

LỖI: kiểu dữ liệu json không có lớp toán tử mặc định cho phương thức truy cập "btree" GỢI Ý: Bạn phải chỉ định một lớp toán tử cho chỉ mục hoặc xác định một lớp toán tử mặc định cho kiểu dữ liệu.


8
"Câu hỏi ở đâu?" - TRONG tiêu đề
rlib

2
Trong tương lai, vui lòng xem stackoverflow.com/tags/postgresql/info , phần "đặt câu hỏi hay hơn"; nó có thể giúp nhận được câu trả lời tốt hơn sớm hơn với ít câu hỏi khó chịu hơn.
Craig Ringer

Câu trả lời:


186

Tìm:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));

Như đã nêu trong các ý kiến, sự khác biệt tinh tế ở đây là ->>thay vì ->. Cái trước trả về giá trị dưới dạng văn bản, cái sau là đối tượng JSON.



39
Chỉ trong trường hợp bạn đang tìm kiếm sự khác biệt: Đó là ->>thay vì ->. Cái trước trả về giá trị dưới dạng văn bản, cái sau trả về một đối tượng JSON.
Daniel Rikowski

35
Dấu ngoặc kép cũng rất quan trọng.
Ron

11
@Jac_opo Tuy nhiên, nó trích xuất chúng dưới dạngTEXT . Nếu bạn muốn làm so sánh số nguyên thay vì so sánh chuỗi, bạn phải thêm một dàn diễn viên: ((info->>'name')::INT).
jpmc26

13
Nếu bạn muốn tạo chỉ mục trên một trường bên trong một đối tượng con của cột JSON của mình, nhờ @DanielRikowski, tôi đã tìm ra mình cần phải làm create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Trước tiên, chúng ta cần sử dụng ->để lấy đối tượng JSON và sau đó ->>để lấy giá trị đối tượng con như bản văn.
Corey Cole
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.