我有一个带有jsonb
列的数据库,其中每一行都包含一个名称值对数组。
[
{"name":"foo", "value":"bar"},
{"name":"biz", "value":"baz"},
{"name":"beep", "value":"boop"}
]
如何查询包含部分值的行?例如,查找JSON对象键为value
(如'%ba %')的行?
我知道可以使用SELECT * FROM tbl WHERE jsoncol @> '[{"value":"bar"}]'
查找JSON为该特定值的行,但是如何查询包含模式的行呢?
2条答案
按热度按时间o2gm4chl1#
Postgres 12或更高版本
使用SQL/JSON路径表达式,其中可以使用
like_regex
进行测试:仅添加
flag "i"
以进行不区分大小写的匹配。可以创建索引。请参阅:
Postgres 11岁或以上
没有内置的
jsonb
操作符,也没有直接支持这种过滤器的索引。我建议使用
EXISTS
半连接:它避免了冗余的计算,并且避免了最后的
DISTINCT
步骤,您将需要使用普通的CROSS JOIN
来获得不同的行。如果这仍然不够快,一种更复杂的特定查询类型的解决方案是在
IMMUTABLE
函数中提取每行唯一值的连接字符串(使用不会干扰搜索模式的分隔符),在函数表达式上构建三元组GIN索引,并在查询中使用相同的表达式。相关:
另外,如果您的
jsonb
值确实与示例类似,则可以去除大量噪声并存储:lc8prwob2#
可以在横向连接中使用函数
jsonb_array_elements()
,并在WHERE
子句中使用其结果value
:有关
distinct
和性能的说明,请阅读How to query jsonb arrays with IN operator。