/ / JSONB Postgres 9.4 - Suche, Indexierung, Postgresql-9.4, Jsonb

JSONB Postgres 9.4 - Suche, Indexierung, Postgresql-9.4, Jsonb

Ich habe einen Jsonb, der mein Bestellprodukt speichert:

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

Aufzeichnungen:

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

Ich indiziere bereits Daten mit GIN.

Wie mache ich:

  1. Wählen Sie alle Verkäufe mit PROD001 aus
  2. Wählen Sie alle Verkäufe mit der Artikel-ID LIKE P% 1 aus
  3. Wählen Sie alle Verkäufe mit Anzahl> 10 aus
  4. Holen Sie sich jedes Produkt Gesamtmenge

Antworten:

0 für die Antwort № 1

Postgres-Dokumentation zu JSON Die Funktionalität ist wirklich klar und Ihre Aufmerksamkeit wert. Bei den von Ihnen bereitgestellten Anwendungsfällen können die Antworten folgende sein:

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

Für das letzte Beispiel müssen Sie nur verwenden Postgres Window-Funktion:

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

0 für die Antwort № 2

Beispiele 1, 3 mit JsQuery-Erweiterung

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"

Die WHERE-Klausel der inneren Abfrage filtert Zeilen nicht über ein Array-Element, das den Anforderungen entspricht. Als jsonb_array_elements-Funktion wird nur für benötigte Zeilen der Tabelle "Konfiguration" verwandt.