【问题标题】:How to create index on JSON field in Postgres?如何在 Postgres 中的 JSON 字段上创建索引?
【发布时间】:2013-07-22 08:04:21
【问题描述】:

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

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

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

【问题讨论】:

  • “问题在哪里?” - 在标题中
  • 以后请看stackoverflow.com/tags/postgresql/info,“提出更好的问题”部分;它可能有助于更快地获得更好的答案,减少烦人的问题。

标签: json postgresql indexing postgresql-9.3


【解决方案1】:

找到:

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

正如 cmets 中所述,这里的细微差别是 ->> 而不是 ->。前者以文本形式返回值,后者以 JSON 对象形式返回。

【讨论】:

  • 以防万一您正在寻找差异:它是 ->> 而不是 ->。前者以文本形式返回值,后者返回 JSON 对象。
  • 双括号也很重要。
  • @Jac_opo 不过,它会将它们提取为 TEXT。如果要进行整数比较而不是字符串比较,则必须添加强制转换:((info->>'name')::INT).
  • 也适用于唯一索引:CREATE UNIQUE INDEX ON publishers((info->>'name'));
  • 如果您想在 JSON 列的子对象内的字段上创建索引,感谢@DanielRikowski 我发现我需要做create index idx_name on table_name ((json_column->'child_obj'->>'child_obj_field')); 我们首先需要使用->获取 JSON 对象,然后 ->> 获取子对象值作为文本。
猜你喜欢
  • 2018-06-25
  • 2012-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多