Search JSONB博士后9.4

Search JSONB博士后9.4,search,indexing,postgresql-9.4,jsonb,Search,Indexing,Postgresql 9.4,Jsonb,我有一个jsonb存储我的订单产品: CREATE TABLE configuration ( documentid text PRIMARY KEY , data jsonb NOT NULL ); 记录: (1, [{"itemid": "PROD001", "qty": 10}, {"itemid": "PROD002", "qty": 20}]), (2, [{"itemid": "PROD001", "qty": 5}, {"itemid": "PROD003", "qty":

我有一个jsonb存储我的订单产品:

CREATE TABLE configuration (
  documentid text PRIMARY KEY
, data jsonb NOT NULL
);
记录:

(1, [{"itemid": "PROD001", "qty": 10}, {"itemid": "PROD002", "qty": 20}]),
(2, [{"itemid": "PROD001", "qty": 5}, {"itemid": "PROD003", "qty": 6}, {"itemid": "PROD004", "qty": 7}]),
(2, [{"itemid": "PROD002", "qty": 8}])
我已经使用GIN索引数据了

我如何:

  • 选择具有PROD001的所有销售
  • 选择具有itemid(如P%1)的所有销售
  • 选择数量大于10的所有销售
  • 获取每个产品的总数量
  • 功能非常清晰,值得您关注。对于您提供的用例,答案可能如下:

    -- Answer 1
    SELECT sales_item 
    FROM configuration,jsonb_array_elements(data) AS sales_item
    WHERE sales_item->>'itemid' = 'PROD001'; --  "->>" returns TEXT value
    -- Answer 2
    SELECT sales_item FROM configuration,jsonb_array_elements(data) AS sales_item
    WHERE sales_item->>'itemid' LIKE 'P%1'; -- just use LIKE
    -- Answer 3
    SELECT sales_item FROM configuration,jsonb_array_elements(data) AS sales_item
    WHERE (sales_item->>'qty')::INTEGER > 10; -- convert TEXT to INTEGER
    
    对于最后一个示例,您只需要使用:

    示例1、3和

    内部查询WHERE子句筛选器行没有任何符合要求的数组元素。而不是jsonb_数组_元素函数。仅适用于“配置”表中所需的行

    -- Answer 4 
    SELECT DISTINCT documentid,sum((sales_item->>'qty')::INTEGER) 
    OVER (PARTITION BY documentid)
    FROM configuration,jsonb_array_elements(data) as sales_item;
    
    SELECT * FROM 
        (SELECT jsonb_array_elements(data) as elem FROM configuration
        WHERE data @@ '#.itemid = "PROD001"') q
        WHERE q.elem @@ 'itemid = "PROD001"'
    
    SELECT * FROM 
        (SELECT jsonb_array_elements(data) as elem FROM configuration
        WHERE data @@ '#.qty > 10') q
        WHERE q.elem @@ 'qty > 10'