我在一个PostgreSQL数据库中保存了一个jsonb,它的 struct 是:

{
  "foo": {
    "key0": {
      "bar": "myValueA",
    },
    "key1": {
      "bar": "myValueB",
    }
    // ...
    "keyN": {
      "bar": "myValueN",
    }
  }
}

我想要获取所有路径'foo' > ANY_KEY > 'bar'中具有文本"myValueX"的所有记录

它可以是'foo' > 'key0' > 'bar''foo' > 'key1' > 'bar'或任何keyN.

"pseudo"PostgreSQL中:

SELECT * FROM "myTable" WHERE "myColumn" #>> '{foo,*,bar}' = 'myValue';

其中*意味着"can be any key".

有没有办法实现这样的查询?

推荐答案

它不是pseudo PostgreSQL,它只是PostgreSQL JSONPath.@@ operator的工作原理完全是这样的:demo

select * from "myTable" 
where "myColumn" @@ '$.foo.*.bar=="myValueN"';
myColumn
{"foo": {"key0": {"bar": "myValueA"}, "key1": {"bar": "myValueB"}, "keyN": {"bar": "myValueN"}}}

@@等于supported by GIN jsonb_ops and jsonb_path_ops,因此您可以使用索引来加快速度:

create index on "myTable" using gin("myColumn");

Postgresql相关问答推荐

环境变量在Bash应用程序中没有出现

如何接受jsonb路径中的任何密钥?

锁定模式与PostgreSQL中的另一种锁定模式冲突到底是什么意思?

将XML解析从T-SQL迁移到Postgres时出现问题

Postgres 函数 now() 返回不正确的时区偏移量

使用psql的copy语句时如何压缩数据?

从单选插入到多个表

使用正则表达式计算 SQL 查询中 WHERE 过滤器的数量

对 Postgres 进行身份验证时如何使用自定义密码哈希算法?

Heroku Rails 4 无法连接到服务器:connection refused

我如何在docker中备份数据库

SQLAlchemy、Psycopg2 和 Postgresql 复制

在 Spring Boot 上使用 Hibernate 映射 PostGIS 几何点字段

如何在 plpgsql 中使用记录类型变量?

manage.py 迁移时必须是关系 django_site 的所有者

Android 的 JDBC 与 Web 服务

如何在 postgresql 中获取整个表的哈希?

如何从我的 postgresql 查询中获取最小值、中值和最大值?

如何更改 PostgreSQL 中的 REFERENCES?

pg_restore 目录错误