/ / JSONB Postgres 9.4 - ricerca, indicizzazione, postgresql-9.4, jsonb

JSONB Postgres 9.4 - ricerca, indicizzazione, postgresql-9.4, jsonb

Ho un jsonb che memorizza il prodotto del mio ordine:

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

Records:

(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}])

Ho già indicizzato i dati utilizzando GIN.

Come posso:

  1. Seleziona tutte le vendite con PROD001
  2. Seleziona tutte le vendite che hanno itemid LIKE P% 1
  3. Seleziona tutte le vendite con qty> 10
  4. ottenere ogni prodotto qty totale

risposte:

0 per risposta № 1

Documentazione di Postgres relativa a JSON la funzionalità è davvero chiara e merita la tua attenzione. Per quanto riguarda i casi d'uso che hai fornito, le risposte potrebbero essere le seguenti:

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

Per l'ultimo esempio, devi solo usarlo Funzione Finestra Postgres:

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

0 per risposta № 2

Esempi 1,3 con Estensione 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"

La clausola WHERE della query interna filtra le righe non ha alcun elemento dell'array che corrisponde ai requisiti, ma jsonb_array_elements func viene applicato solo alle righe necessarie della tabella "configuration".