我正在使用 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"]';
需要注意的是,上面的数组不会返回空数组,而只有 <@ 会返回。