Postgres'te JSON alanında nasıl index oluşturulur?


111

PostgreSQL 9.3 Beta 2'de (?), JSON alanında nasıl indeks oluşturabilirim? ->Kullanılan operatörü kullanarak denedim hstoreancak aşağıdaki hatayı aldım:

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

HATA: json veri türünün "btree" erişim yöntemi için varsayılan operatör sınıfı yoktur İPUCU: Dizin için bir operatör sınıfı belirtmeniz veya veri türü için varsayılan bir operatör sınıfı tanımlamanız gerekir.


8
"Soru nerede?" - başlıkta
rlib

2
Gelecekte lütfen "daha iyi sorular sorma" bölümü olan stackoverflow.com/tags/postgresql/info adresine bir göz atın ; daha az sinir bozucu soruyla daha kısa sürede daha iyi yanıtlar almanıza yardımcı olabilir.
Craig Ringer

Yanıtlar:


186

Bulundu:

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

Yorumlarda belirtildiği gibi, buradaki ince fark ->>bunun yerine ->. İlki, değeri metin olarak, ikincisi ise JSON nesnesi olarak döndürür.



39
Sadece durumda fark arıyoruz: Öyle ->>yerine ->. İlki, değeri metin olarak döndürür, ikincisi ise bir JSON nesnesi döndürür.
Daniel Rikowski

35
Çift parantezler de önemlidir.
Ron

11
Bunları ayıklar @Jac_opo olarakTEXT da,. Eğer tamsayı karşılaştırmaları yerine dize karşılaştırmaları yapmak istiyorsanız, bir döküm eklemek zorunda: ((info->>'name')::INT).
jpmc26

13
JSON sütununuzun bir alt nesnesinin içindeki bir alanda bir dizin oluşturmak istiyorsanız, @DanielRikowski sayesinde yapmam gerektiğini anladım create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Önce ->JSON nesnesini almak için kullanmalıyız ve sonra ->>alt nesne değerini almalıyız. Metin.
Corey Cole
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.