Postgres以有效的方式访问JSONB元素

时间:2017-04-20 07:57:58

标签: json postgresql indexing

我有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

1 个答案:

答案 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]}]';
    

http://rextester.com/ZMCUME18642