您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

在PostgreSQL中的JSON数组中使用索引

在PostgreSQL中的JSON数组中使用索引

原始答案中的这个特定jsonb示例缺少[]用于包含查询的非原始对象周围的数组层。此后已修复。

Postgresql 9.4.xjsonb包含和存在的行为记录为:

一般原则是,所包含的对象必须在结构和数据内容上与所包含的对象匹配

作为结构必须匹配的一般原则的特殊例外,数组可以包含原始值

特殊例外允许我们执行以下操作:

CREATE TABLE tracks (id serial, artistnames jsonb);
CREATE INDEX tracks_artistnames_gin_idx ON tracks USING gin (artistnames);
INSERT INTO tracks (id, artists) VALUES (1, '["blink-182"]');
INSERT INTO tracks (id, artists) VALUES (2, '["The Dirty Heads", "Louis Richards"]');

我们可以使用一般原则来查询遏制:

SELECT * FROM tracks WHERE artistnames @> '["The Dirty Heads"]';
 id |              artistnames              
----+---------------------------------------
  2 | ["The Dirty Heads", "Louis Richards"]
(1 row)

我们还可以使用特殊异常来查询包含,因为数组包含原始类型:

SELECT * FROM tracks WHERE artistnames @> '"The Dirty Heads"';
 id |              artistnames              
----+---------------------------------------
  2 | ["The Dirty Heads", "Louis Richards"]
(1 row)

有4种原始类型,它们允许对数组进行包含和存在查询工作:

由于您在问题中提到的示例正在处理嵌套在数组内的对象,因此我们不符合上述特殊例外的条件:

CREATE TABLE tracks (id serial, artists jsonb);
CREATE INDEX tracks_artists_gin_idx ON tracks USING gin (artists);
INSERT INTO tracks (id, artists) VALUES (1, '[{"name": "blink-182"}]');
INSERT INTO tracks (id, artists) VALUES (2, '[{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]');

我们可以使用一般原则来查询遏制:

SELECT * FROM tracks WHERE artists @> '[{"name": "The Dirty Heads"}]';
 id |                          artists                          
----+-----------------------------------------------------------
  2 | [{"name": "The Dirty Heads"}, {"name": "Louis Richards"}]
(1 row)

对象不是原始类型,因此以下包含条件查询不符合特殊例外条件,因此不起作用:

SELECT * FROM tracks WHERE artists @> '{"name": "The Dirty Heads"}';
 id | artists 
----+---------
(0 rows)
SQLServer 2022/1/1 18:38:22 有271人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶