Bagaimana cara membuat indeks pada bidang JSON di Postgres?


111

Di PostgreSQL 9.3 Beta 2 (?), Bagaimana cara membuat indeks pada bidang JSON? Saya mencobanya menggunakan ->operator yang digunakan untuk hstoretetapi mendapat kesalahan berikut:

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

EROR: tipe data json tidak memiliki kelas operator default untuk metode akses "btree" PETUNJUK: Anda harus menentukan kelas operator untuk indeks atau menentukan kelas operator default untuk tipe data.


8
"Di mana pertanyaannya?" - DALAM judul
rlib

2
Di masa mendatang, harap lihat stackoverflow.com/tags/postgresql/info , bagian "menanyakan pertanyaan yang lebih baik"; mungkin membantu mendapatkan jawaban yang lebih baik lebih cepat dengan lebih sedikit pertanyaan yang mengganggu.
Craig Ringer

Jawaban:


186

Ditemukan:

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

Seperti yang dinyatakan dalam komentar, perbedaan halus di sini adalah ->>alih-alih ->. Yang pertama mengembalikan nilai sebagai teks, yang terakhir sebagai objek JSON.



39
Untuk berjaga-jaga jika Anda mencari perbedaannya: Ini ->>bukan ->. Yang pertama mengembalikan nilai sebagai teks, yang terakhir mengembalikan objek JSON.
Daniel Rikowski

35
Tanda kurung ganda juga penting.
Ron

11
@Jac_opo Ini mengekstrak mereka sebagaiTEXT , meskipun. Jika Anda ingin melakukan perbandingan bilangan bulat bukan perbandingan string, Anda harus menambahkan gips: ((info->>'name')::INT).
jpmc26

13
Jika Anda ingin membuat indeks pada bidang di dalam sub-objek kolom JSON Anda, terima kasih kepada @DanielRikowski, saya tahu yang perlu saya lakukan create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Pertama-tama kita perlu menggunakan ->untuk mendapatkan objek JSON dan kemudian ->>mendapatkan nilai objek anak sebagai teks.
Corey Cole
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.