Come creare un indice sul campo JSON in Postgres?


111

In PostgreSQL 9.3 Beta 2 (?), Come creo un indice su un campo JSON? L'ho provato utilizzando l' ->operatore utilizzato per hstorema ho ricevuto il seguente errore:

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

ERRORE: il tipo di dati json non ha una classe operatore predefinita per il metodo di accesso "btree" SUGGERIMENTO: è necessario specificare una classe operatore per l'indice o definire una classe operatore predefinita per il tipo di dati.


8
"Dov'è la domanda?" - NEL titolo
rlib

2
In futuro, dai un'occhiata a stackoverflow.com/tags/postgresql/info , la sezione "fare domande migliori"; potrebbe aiutare a ottenere risposte migliori prima con meno domande fastidiose.
Craig Ringer

Risposte:


186

Trovato:

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

Come affermato nei commenti, la sottile differenza qui è ->>invece di ->. Il primo restituisce il valore come testo, il secondo come oggetto JSON.



39
Nel caso tu stia cercando la differenza: è ->>invece di ->. Il primo restituisce il valore come testo, il secondo restituisce un oggetto JSON.
Daniel Rikowski

35
Anche le doppie parentesi sono importanti.
Ron

11
@Jac_opo Li estrae comeTEXT , però. Se si vuole fare paragoni interi, invece di confronti tra stringhe, si deve aggiungere un cast: ((info->>'name')::INT).
jpmc26

13
Se vuoi creare un indice su un campo all'interno di un sottooggetto della tua colonna JSON, grazie a @DanielRikowski ho capito che dovevo farlo create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));Dobbiamo prima usare ->per ottenere l'oggetto JSON e poi ->>per ottenere il valore dell'oggetto figlio come testo.
Corey Cole
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.