我有一个postgres表,其中有一个jsonb列,其中包含我们要查询的列表.Jsonb列数据如下所示:

{"org": 3, "subscriberCodes": ["A555", "A666"]}

我希望能够对表进行查询,以按订户代码进行搜索.

我知道我可以做一个LIKE查询:

SELECT *
FROM permissions.application_settings
WHERE configuration->>'subscriberCodes' LIKE '%A555%'

但这有几个问题,我必须按订户代码触发查询(我试图弄清楚如何执行WHERE IN子句,但不太清楚),结果是对整个表进行顺序扫描(对于我们拥有的记录数量来说,这不是很好).

我对jsonb还不是很在行.有没有一种方法可以执行WHERE IN子句,并可能在订户代码数组上创建索引,以便不需要顺序扫描?

推荐答案

知道您计划如何查询列、您将使用的which functions and operators以及最有针对性的下标是很好的--这对select an adequate index很有帮助.您可以从为jsonpath:demo使用的整个内容建立索引开始

create index on permissions.application_settings using gin (jsonb_path_ops);

select * from permissions.application_settings
where configuration @? '$.subscriberCodes[*]?(@=="A555")';

expression/functional index可以将索引限制为下标:

create index on permissions.application_settings 
  using gin ((configuration->'subscriberCodes') jsonb_path_ops);

select * from permissions.application_settings
where configuration->'subscriberCodes' @? '$[*]?(@=="A555")';

你也可以坚持non-jsonpath种方法:

create index on permissions.application_settings 
  using gin ((configuration->'subscriberCodes') jsonb_ops);

select * from permissions.application_settings
where configuration->'subscriberCodes' ? 'A555';

Postgresql相关问答推荐

分区可以用于postgres中的同类查询吗?

PostgreSQL:重新创建主键值以匹配记录计数

Select 与输入数组完全相交的所有行?

是否可以短时间运行 VACUUM FULL 并获得一些好处?

Regexp_replace 行为会改变,如果它用空白字符串或 null 替换字符串数组中的字符串

如何展平也在关系中使用的区分大小写的列

当我写 SELECT ~1;在 Postgresql 上它给了我 -2 结果.这是什么原因?它一直持续〜4和-5等

Postgres 根据自己的估计 Select 一个更费时的查询计划

Hibernate 将用户模型保存到 Postgres

如何在 psycopg2 中使用服务器端游标

在 PostgreSQL 中将时间转换为秒

遇到序列化失败的条件是什么?

如何让 Rails 使用 SSL 连接到 PostgreSQL?

postgresql 在查询中插入空值

从没有行的计数中获取 0 值

我怎样才能知道 Postgresql 表空间中有什么?

使用 Hibernate 查询:colon gets treated as parameter / escaping colon

在 PostgreSQL 中的表上禁用 DELETE?

安装了 Postgres.app 但它不起作用

实时监控 PostgreSQL 查询的应用程序?