【问题标题】:PostgreSQL JSONB Array Row Must Exist in Passed in ArrayPostgreSQL JSONB 数组行必须存在于传入数组中
【发布时间】:2020-04-05 08:59:04
【问题描述】:

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

使用?|&lt;@ 语法的任何变通方法?

【问题讨论】:

    标签: postgresql jsonb


    【解决方案1】:

    如果你使用 text[] 而不是 JSONB,那么

    如果你真的需要 JSONB,那么你可以使用 ?|获取索引使用情况并

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

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

    【讨论】:

    • 如果我使用 text[],什么是合适的索引?杜松子酒指数?我做了解释,我得到了 Seq Scan。 Seq Scan on mytable (cost=0.00..13.12 rows=1 width=296) Filter: (feature &lt;@ '{happy,motivated}'::text[]).
    • 正确。对于一个很小的表,它不会使用索引,因为读取整个表会更快。你要么需要一个大表,要么需要set enable_seqscan=off,才能看到索引扫描。
    猜你喜欢
    • 2020-11-11
    • 2015-08-15
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多