2017-04-20 29 views
1

我有batch_table表,其中包含batchid类型的串行INT和data类型JSONB的,我用GINdata列索引,Postgres的访问JSONB元素有效的方式

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其他查询

回答

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在同一个对象中年= 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]}]'; 
    
  • 这将选择行,其中年= 2000的productid = 21是在同一个对象以及的productid = 5

    select * 
    from batch_table 
    where data @> '[{"year":2000,"productid":[21, 5]}]'; 
    

http://rextester.com/ZMCUME18642

+0

感谢一个很多,它正在按我的需要工作 – Harish