首页 > 解决方案 > PostgreSQL JSONB 数组行必须存在于传入数组中

问题描述

我正在使用 jsonb 列将特征存储在数组中(我遵循 @a_horse_with_no_name 在Best Way to Index All JSONB Fields With Boolean Values in PostgreSQL 中的建议)。

例子:

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 索引。据我了解?|会更高效,但我需要使用<@,因为行必须存在于数组中。 ?|只能从行中的数组中找到任何关键元素,而不是包含数组中的每一行。

?|使用vs<@语法的任何解决方法?

标签: postgresqljsonb

解决方案


如果您使用 text[] 而不是 JSONB,那么 <@ 将是可直接索引的。

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

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

一个警告是上面不会返回空数组,而只有 <@ 会。


推荐阅读