/ / JSONB Postgres 9.4 - 検索、索引付け、postgresql-9.4、jsonb

JSONB Postgres 9.4 - 検索、索引付け、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": 6}, {"itemid": "PROD004", "qty": 7}]),
(2, [{"itemid": "PROD002", "qty": 8}])

私はすでにGINを使用してデータをインデックス化しています。

どうすればいいの?

  1. PROD001を持つすべての売上を選択
  2. itemid LIKE P%1を持つすべての売上を選択してください
  3. 数量> 10のすべての売上を選択
  4. 各製品の合計数量を取得する

回答:

回答№1は0

JSONに関するPostgresのドキュメント 機能性は本当に明確で、あなたの注意を引く価値があります。提供したユースケースについては、次のような回答があります。

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

最後の例では、 Postgresウィンドウ関数

-- Answer 4
SELECT DISTINCT documentid,sum((sales_item->>"qty")::INTEGER)
OVER (PARTITION BY documentid)
FROM configuration,jsonb_array_elements(data) as sales_item;

回答№2の場合は0

例1,3 JsQuery拡張機能

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"

内部クエリWHERE句のフィルタ行には、要件に一致する配列要素はありません。jsonb_array_elements func。は「構成」表の必要な行にのみ適用されます。