如何在Postgres 9.3中的json字段上创建索引

rli*_*lib 96 postgresql postgresql-9.3

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

 CREATE TABLE publishers(id INT, info JSON);
 CREATE INDEX ON publishers((info->'name'));
Run Code Online (Sandbox Code Playgroud)

错误:数据类型json没有访问方法"btree"的默认运算符类提示:必须为索引指定运算符类或为数据类型定义默认运算符类.

rli*_*lib 163

实测:

CREATE TABLE publishers(id INT, info JSON); 
CREATE INDEX ON publishers((info->>'name'));
Run Code Online (Sandbox Code Playgroud)

  • 万一你要找的区别:它是` - >>`而不是` - >`.前者将值作为文本返回,后者返回JSON对象. (36认同)
  • 双括号也很重要. (33认同)
  • 如果你想在JSON列的子对象内的字段上创建一个索引,感谢@DanielRikowski,我想我需要在table_name上创建`create index idx_name((json_column - >'child_obj' - >>'child_obj_field '));`我们首先需要使用` - >`来获取JSON对象,然后使用` - >>`来获取子对象值作为文本. (11认同)
  • @Jac_opo它将它们提取为**作为"TEXT"**.如果你想进行整数比较而不是字符串比较,你必须添加一个强制转换:`((info - >>'name'):: INT)`. (10认同)
  • [JSON函数和操作符](http://www.postgresql.org/docs/9.3/static/functions-json.html) (3认同)
  • 更一般地说,这看起来像一个基于表达式的索引的例子http://www.postgresql.org/docs/9.4/static/indexes-expressional.html. (2认同)
  • 也可用于唯一索引:`在发布者上创建唯一索引((info->>'name'));` (2认同)
  • 如果要创建整个json语句的索引(例如,为了确保它在表中是唯一的),可以将它转换为索引`CREATE UNIQUE INDEX on myTable((DATA :: TEXT)); ` (2认同)