我有batch_table
表,其中包含batchid
类型的serial int和data
类型的JSONB,我使用data
索引GIN
列,
batchid | data
---------------------------------------------
1 | [{"year":2000,"productid":[21, 32, 5]}]
2 | [{"year":2001,"productid":[21, 39, 5]},{"year":2000,"productid":[1, 25, 5]}]
3 | NULL
4. | [{"year": 2000,"productid":[5]}
现在我希望通过使用以下要求获得batchid
1. year
= 2000& productid
= 5
2. year
= 2000& productid
=(21或5)
3. year
= 2000& productid
=(21& 5)
我试过这个
SELECT batchid FROM batch_table WHERE (data->>'year')::int = 2000 AND (data->>'productid')::int = 5;
AND
&其他查询OR
答案 0 :(得分:2)
您可以使用containment operator @>
搜索jsonb
(这甚至可以使用您的索引):
1
select *
from batch_table
where data @> '[{"year":2000,"productid":[5]}]';
2
select *
from batch_table
where data @> '[{"year":2000,"productid":[21]}]'
or data @> '[{"year":2000,"productid":[5]}]';
3
根据您的需要,您可以使用以下方法之一:
这些将选择行,其中year = 2000,productid = 21属于同一个对象, year = 2000,productid = 5属于同一个对象(但这些对象可以是不同的。)
select *
from batch_table
where data @> '[{"year":2000,"productid":[21]}]'
and data @> '[{"year":2000,"productid":[5]}]';
select *
from batch_table
where data @> '[{"year":2000,"productid":[21]},{"year":2000,"productid":[5]}]';
这将选择行,其中year = 2000,productid = 21属于同一个对象以及 productid = 5
select *
from batch_table
where data @> '[{"year":2000,"productid":[21, 5]}]';