json - 在 jsonb postgres 中替代 Like

标签 json postgresql jsonb

我有一个包含超过 2500 万条记录的 Postgres 表,其中有一个名为 info 的 jsonb 列。

示例 json 格式:

{
"username1":{"name":"somename","age":22,"gender":"male"},
"fathername":{"name":"somename","age":22,"gender":"male"}
}

我要查找与“user%”键值匹配的记录数。

这是我的问题

select count(1) from tablename where info::text like '%user%';

此查询有效,我正在获取结果,但在 2500 万条记录中执行此查询需要很长时间。

有什么方法可以优化此查询或任何替代方法来实现它?请帮忙。

提前致谢!

最佳答案

正如@klin 所指出的,这个查询只会给你 0:

select count(1) from tablename where info::text like 'user%';

为什么,因为这只是一个简单的模式匹配,而您的信息列中没有任何以“user”开头的字符串。使用 '%user%' 可能会更好,但这会非常慢(除非您启用了 trigram 扩展并创建了索引)

如果您想准确计算有多少用户设置了username1,这是一个非常简单的查询。

select count(1) from tablename where info ? 'username1'

这适用于 9.5 .如果您的“user%”关键字数量有限,您可以尝试这样的操作:

select count(1) from tablename where info ?| array['username1','username2',..]

如果您不确定 key 的性质,那么您可以这样做

SELECT COUNT(1) FROM (
    SELECT * FROM JSONB_EACH(info) FROM tablename
) AS a WHERE a.key like '%user%'

关于json - 在 jsonb postgres 中替代 Like,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38571892/

相关文章:

javascript - 如何将数组列表格式化为json

javascript - 通过类型转换从 json 对象获取 Value

c# - 可能的 JSON 到 C# 中的字典

sql - 错误: could not create unique index DETAIL: Key (id)=(3105115) is duplicated

database - 如何实现灵活的表格

python - 如何用 Pandas 读取json文件?

ruby-on-rails - 无法在 Heroku 上创建表——迁移在本地工作但在 Heroku 上失败

postgresql - 如何将 JsonNode 参数(micronaut + kotlin)保存为 postgres 数据库中的 jsonb

xml - 如何在 Postgres 中将 XML 转换为 JSONB

json - 将 Json-in-TEXT 列转换为真正的 JSONB 列