【问题标题】:Postgres accessing JSONB elements in efficient wayPostgres 以有效的方式访问 JSONB 元素
【发布时间】:2017-09-16 17:37:06
【问题描述】:

我有batch_table 表,其中包含batchid 串行int 类型和data JSONB 类型,我使用GIN 索引data 列,

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

【问题讨论】:

    标签: json postgresql indexing


    【解决方案1】:

    您可以使用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

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      • 2015-07-12
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多