Postgresql 根据多个值查询Postgres中的jsonb列

Postgresql 根据多个值查询Postgres中的jsonb列,postgresql,jsonb,Postgresql,Jsonb,我在PostgreSQL数据库中有一个类型为jsonb的列“carInfo”,我希望能够查询多个值。我希望查询只返回那些符合所有条件的行。例如,如果我有多个列,我会这样编写查询: select * from car where name = 'BMW' AND 'year' = 2020 select * from car where carInfo @> cast('{"name":"BMW"}') as jsonb AND ca

我在PostgreSQL数据库中有一个类型为
jsonb
的列“carInfo”,我希望能够查询多个值。我希望查询只返回那些符合所有条件的行。例如,如果我有多个列,我会这样编写查询:

select * 
from car 
where name = 'BMW' 
AND 'year' = 2020
select * 
from car 
where carInfo @> cast('{"name":"BMW"}') as jsonb 
  AND carInfo @> cast('{"year":"2020"}')
select * 
from car 
where carInfo @> any(array['{"name":"BMW"}', '{"year":"2020"}']::jsonb[])
由于我的列是
jsonb
类型,我可以像这样使用包含运算符(@>):

select * 
from car 
where name = 'BMW' 
AND 'year' = 2020
select * 
from car 
where carInfo @> cast('{"name":"BMW"}') as jsonb 
  AND carInfo @> cast('{"year":"2020"}')
select * 
from car 
where carInfo @> any(array['{"name":"BMW"}', '{"year":"2020"}']::jsonb[])
但是我希望查询是动态的,这样用户就可以根据他们想要的任何属性进行查询

因此,他们将发送一个搜索词列表(在本例中,该列表的元素将是
{“name”:“BMW”}
{“year”:“2020”}

假设我有如上所述的列表,如果我想获得与使用AND运算符时相同的结果,查询会是什么样子

我这样试过:

select * 
from car 
where name = 'BMW' 
AND 'year' = 2020
select * 
from car 
where carInfo @> cast('{"name":"BMW"}') as jsonb 
  AND carInfo @> cast('{"year":"2020"}')
select * 
from car 
where carInfo @> any(array['{"name":"BMW"}', '{"year":"2020"}']::jsonb[])

但其作用与使用OR运算符时相同。我需要找到同时包含两个搜索词的行

您可以使用
@>所有
,但这应该更好:

WHERE carInfo @> cast('{"name":"BMW", "year": "2020"}' as jsonb)

您可以使用
@>ALL
,但这应该更好:

WHERE carInfo @> cast('{"name":"BMW", "year": "2020"}' as jsonb)

您可以将所有这些键/值合并为一个
jsonb
值,并查看
carInfo
是否包含该值,例如
SELECT*FROM car WHERE carInfo>'{“name”:“BMW”,“year”:2020}
。您的
@>任何(…)
解决方案都可以更改为
@>所有(…)
使其成为
,但如果可以的话,我强烈建议您改为执行单个
操作。您可以将所有这些键/值合并为单个
jsonb
值,并查看
carInfo
是否包含该值,例如
SELECT*FROM car WHERE carInfo>'{“name”:“BMW”,“year”:2020}“
。您的
@>任何(…)
解决方案都可以更改为
@>所有(…)
使其成为
,但如果可以的话,我强烈建议您执行单个
@
操作。谢谢。对我来说,这只在
内铸jsonb
时起作用function@KiraAG不足为奇,因为我的答案包含一个拼写错误。我已经修复了它,谢谢你的提示。谢谢。对我来说,这只在
a时有效s jsonb
为内铸function@KiraAG不足为奇,因为我的答案有一个拼写错误。我已经改正了,谢谢你的提示。