Postgresql 根据多个值查询Postgres中的jsonb列
我在PostgreSQL数据库中有一个类型为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
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不足为奇,因为我的答案有一个拼写错误。我已经改正了,谢谢你的提示。