postgresql - 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<@
语法的任何解决方法?
解决方案
如果您使用 text[] 而不是 JSONB,那么 <@ 将是可直接索引的。
如果你真的需要 JSONB,那么你可以使用 ?| 获取索引使用情况并 <@ 排除误报:
SELECT * FROM mytable WHERE feature ?| '{"happy", "motivated"}' feature <@ '["happy", "motivated"]';
一个警告是上面不会返回空数组,而只有 <@ 会。
推荐阅读
- php - Base64解码在php中没有给出值
- python - Visual Studio 2015中python字符串的f格式
- arduino - 连续两次调用analogWrite 后,Arduino Mega2560 重新启动
- linux - Anaconda Navigator 无法在 Linux Mint 上启动
- sendgrid - 如何将文件附加到 Sendgrid 单次发送电子邮件?
- python - 训练中的损失始终为零
- c# - 如何根据 C# 中的条件组合具有不同属性的两个列表
- python - 如何在 Python sounddevice 中录制特定时间的音频,直到某些操作(如键盘按下)?
- javascript - 在 React useState 中使用(或 ||)语法进行赋值
- apollo - 避免在执行异步代码期间替换/混合 apollo-server 数据源中的用户上下文