我在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'
有什么想法可以实现吗?
答案 0 :(得分:1)
您可以使用包含运算符@>
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)索引,而->
链则无法实现。