PostgreSQL JSONB 数组行必须存在于 Pass in Array 中



我正在使用 jsonb 列将特征存储在数组中(我遵循了 @a_horse_with_no_name 的建议,以最佳方式索引 postgreSQL 中带有布尔值的所有 JSONB 字段(。

例:

feature
------------------------------
[ "happy", "motivated" ]
[ "happy", "fast", "strong" ]
[ "smart", "fast" ]
[ "happy" ]
SELECT * 
FROM mytable 
WHERE feature <@ '["happy"]';

应仅返回第 4 行。

SELECT * 
FROM mytable 
WHERE feature <@ '["happy", "motivated"]';

应返回第 1 行和第 4 行。

SELECT * 
FROM mytable 
WHERE feature <@ '["happy", "motivated", "fast", "strong", "smart"]';

应返回所有 4 行。

我为GIN列编制了索引。据我了解,?|会更高性能,但我需要使用<@,因为行必须存在于数组中。?|只能从行中的数组中找到任何关键元素,而不能找到数组中每一行的包含。

使用?|<@语法有什么解决方法吗?

如果您使用 text[] 而不是 JSONB,则 <@ 将可以直接编制索引。

如果你真的需要JSONB,那么你可以使用?|来获取索引使用情况,<@来排除误报:

SELECT * FROM mytable WHERE feature ?| '{"happy", "motivated"}' feature <@ '["happy", "motivated"]';

需要注意的是,上面的数组不会返回空数组,而只有 <@ 会返回。

最新更新