J'ai un jsonb stockant mon produit de commande:
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}])
J'indexe déjà les données en utilisant GIN.
Comment puis-je:
- Sélectionnez toutes les ventes qui ont PROD001
- Sélectionnez toutes les ventes qui ont itemid LIKE P% 1
- Sélectionnez toutes les ventes qui ont qté> 10
- obtenez chaque quantité totale de produit
Réponses:
0 pour la réponse № 1Documentation Postgres concernant JSON la fonctionnalité est vraiment claire et mérite votre attention. En ce qui concerne les cas d'utilisation que vous avez fournis, les réponses peuvent être les suivantes:
-- 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
Pour le dernier exemple, il vous suffit d'utiliser Fonction de fenêtre 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 pour la réponse № 2
Exemples 1,3 avec Extension 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 requête WHERE de la requête interne filtre les lignes ne contient aucun élément de tableau qui corresponde aux exigences.