Як створити індекс для поля JSON у Postgres?


111

Як створити індекс у полі JSON у PostgreSQL 9.3 Beta 2 (?)? Я спробував це за допомогою ->оператора, який використовується для, hstoreале отримав таку помилку:

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

ПОМИЛКА: тип даних json не має класу операторів за замовчуванням для методу доступу "btree" Підказка: Ви повинні вказати клас оператора для індексу або визначити клас оператора за замовчуванням для типу даних.


8
"Де питання?" - В назві
rlib

2
Надалі перегляньте stackoverflow.com/tags/postgresql/info , розділ "задавати кращі запитання"; це може допомогти швидше отримати кращі відповіді з меншою кількістю дратівливих питань.
Крейг Рінгер

Відповіді:


186

Знайдено:

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

Як зазначено в коментарях, тут є тонка різниця ->>замість ->. Перший повертає значення у вигляді тексту, останній - як об'єкт JSON.



39
Про всяк випадок, коли ви шукаєте різницю: Це ->>замість цього ->. Перший повертає значення у вигляді тексту, останній повертає JSON-об'єкт.
Даніель Ріковський

35
Важливі також подвійні дужки.
Рон

11
@Jac_opo Він витягує їх , якTEXT , хоча. Якщо ви хочете зробити цілі порівняння замість порівняння рядків, ви повинні додати кидок: ((info->>'name')::INT).
jpmc26

13
Якщо ви хочете створити індекс на полі всередині під-об’єкта колонки JSON, завдяки @DanielRikowski я зрозумів, що мені потрібно зробити. create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Спочатку ми повинні використати, ->щоб отримати об'єкт JSON, а потім ->>отримати значення дочірнього об'єкта як текст.
Корі Коул
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.