在 Postgres 中动态查询 jsonb 列
Query a jsonb column dynamically in Postgres
我在 PostgreSQL 数据库中的一个表中有一个类型为 jsonb
的列 carInfo
。示例行如下所示:
{
"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'
知道如何实现吗?
您可以使用包含运算符 @>
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) 索引,这在 ->
链中是不可能的。
我在 PostgreSQL 数据库中的一个表中有一个类型为 jsonb
的列 carInfo
。示例行如下所示:
{
"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'
知道如何实现吗?
您可以使用包含运算符 @>
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) 索引,这在 ->
链中是不可能的。