首页 > 解决方案 > 在 Postgres 中动态查询 jsonb 列

问题描述

我在 PostgreSQL 数据库中的一个表中有一个carInfo类型的列。jsonb示例行如下所示:

{
   "name":"John",
   "age":25,
   "car":{
      "brand":"KIA",
      "year":2015
   }
}

我知道在 PostgreSQL 中你可以这样查询它:

select * from car where carInfo -> 'name' = 'John'

但我想让这个查询动态化(通过使用 PostgreSQL 函数或其他东西),以便我可以从我的 Java 应用程序中查询它。例如,即使我想更深一层,我也想重用相同的查询

select * from car where carInfo -> 'car' -> 'brand' = 'KIA'

知道如何实现这一目标吗?

标签: javasqlpostgresqljdbcjsonb

解决方案


您可以使用包含运算符@>

select *
from car
where car_info @> '{"name": "John"}';

或者

select *
from car
where car_info @> '{"car": {"Brand": "KIA"}}';

在您的 Java 代码中,您可以编写一个 PreparedStatement 来处理这两种情况:

String sql = "select * from car where car_info @> cast(? as jsonb)";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setString(1, "{\"car\": {\"Brand\": \"KIA\"}}";
ResultSet rs = pstmt.executeQuery();

使用操作符还有一个额外的好处,即 Postgres 可以在该列上使用 (GIN) 索引,这在链中@>是不可能的。->


推荐阅读