如何在Postgres中的JSON字段上创建索引?


111

在PostgreSQL 9.3 Beta 2(?)中,如何在JSON字段上创建索引?我使用了->用于的运算符进行hstore了尝试,但出现以下错误:

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

错误:数据类型json没有访问方法“ btree”的默认操作符类提示:您必须为索引指定一个操作符类或为该数据类型定义一个默认操作符类。


8
“问题在哪里?” -在标题中
rlib

2
将来,请查看“提出更好的问题”部分中的stackoverflow.com/tags/postgresql/info;它可能有助于减少麻烦的问题,从而更快地获得更好的答案。
Craig Ringer 2013年

Answers:


186

发现:

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

如评论中所述,此处的细微差别->>->。前者以文本形式返回值,后者以JSON对象形式返回。



39
万一您在寻找不同之处:->>而不是->。前一个返回值作为文本,后一个返回JSON对象。
Daniel Rikowski

35
双括号也很重要。
罗恩

11
@Jac_opo它将它们提取TEXT。如果要进行整数比较而不是字符串比较,则必须添加强制类型转换:((info->>'name')::INT)
2015年

13
如果要在JSON列的子对象内的字段上创建索引,则感谢@DanielRikowski,我知道我需要这样做。create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field'));我们首先需要使用->获取JSON对象,然后->>获取子对象的值,如下所示:文本。
科里·科尔
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.