Como criar índice no campo json no Postgres 9.3

111

No PostgreSQL 9.3 Beta 2 (?), Como faço para criar um índice em um campo JSON? Tentei usando o ->operador usado para, hstoremas obtive o seguinte erro:

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

ERRO: o tipo de dados json não tem classe de operador padrão para o método de acesso "btree" DICA: Você deve especificar uma classe de operador para o índice ou definir uma classe de operador padrão para o tipo de dados.

rlib
fonte
8
"Onde está a pergunta?" - NO título
rlib
2
No futuro, dê uma olhada em stackoverflow.com/tags/postgresql/info , a seção "fazer perguntas melhores"; pode ajudar a obter respostas melhores mais rapidamente com menos perguntas irritantes.
Craig Ringer

Respostas:

186

Encontrado:

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

Conforme declarado nos comentários, a diferença sutil aqui é em ->>vez de ->. O primeiro retorna o valor como texto, o último como um objeto JSON.

rlib
fonte
39
Caso você esteja procurando a diferença: é em ->>vez de ->. O primeiro retorna o valor como texto, o último retorna um objeto JSON.
Daniel Rikowski
35
Os parênteses duplos também são importantes.
Ron
11
@Jac_opo Ele os extrai comoTEXT . Se você quer fazer comparações de inteiros em vez de comparações de strings, você tem que adicionar um elenco: ((info->>'name')::INT).
jpmc26
13
Se você deseja criar um índice em um campo dentro de um subobjeto de sua coluna JSON, graças a @DanielRikowski descobri que precisava fazer create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));. Primeiro precisamos usar ->para obter o objeto JSON e, em seguida, ->>obter o valor do objeto filho como texto.
Corey Cole,