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

Posted

技术标签:

【中文标题】如何在 Postgres 中的 JSON 字段上创建索引?【英文标题】:How to create index on JSON field in Postgres? 【发布时间】: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" 提示:您必须为索引指定一个运算符类或 为数据类型定义一个默认的操作符类。

【问题讨论】:

“问题在哪里?” - 在标题中 以后请看***.com/tags/postgresql/info,“提出更好的问题”部分;它可能有助于更快地获得更好的答案,减少烦人的问题。 【参考方案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 对象,然后 ->> 获取子对象值作为文本。

以上是关于如何在 Postgres 中的 JSON 字段上创建索引?的主要内容,如果未能解决你的问题,请参考以下文章

JSON字段postgres喜欢

AWS Glue 将字符串值从 postgres 转换为 json 数组

如何更新 json 类型的 json 中的任何字段?它应该接受一个对象或一个键数组,如果它存在则更新键,否则创建

从 Greenplum 中的 JSON 中删除 NULL 字段

如何修改新 PostgreSQL JSON 数据类型中的字段?

在 postgres 表中计算不为空的 json 键-> 值