如何在 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 字段上创建索引?的主要内容,如果未能解决你的问题,请参考以下文章
AWS Glue 将字符串值从 postgres 转换为 json 数组
如何更新 json 类型的 json 中的任何字段?它应该接受一个对象或一个键数组,如果它存在则更新键,否则创建
从 Greenplum 中的 JSON 中删除 NULL 字段