Ich habe eine Tabelle, die die Elemente in einem Warenkorb zu verschiedenen Zeitpunkten darstellt. Die Artikel im Warenkorb werden im JSON-Format gespeichert, eine Spalte mit den Werten before
und eine weitere mit den Werten after
.Vergleichen von JSON-Arrays in Postgres
Meine Aufgaben sind die Wagen vergleichen und identifizieren: Artikel hinzugefügt, Artikel entfernt und Preis/Menge ändert.
Ich weiß, ich kann json_array_elements
und einen Kreuz-Join verwenden, um die JSON-Blobs zu entpacken und eine Tabelle mit Elementen aus den JSON-Werten zu erstellen. Aber ich kann mir keinen effizienten Weg vorstellen, um Einkaufswagen zu vergleichen. Kann ich das in SQL machen?
Hier ist ein kleines Beispiel SQL Fiddle:
CREATE TABLE t (
id INT,
before JSON,
after JSON
);
INSERT INTO t VALUES (
1,
'[{"category":"item","id":"1","price":8,"quantity":1},{"category":"item","id":"2","price":20,"quantity":1},{"category":"item","id":"3","price":3,"quantity":1}]',
'[{"category":"item","id":"2","price":40,"quantity":1},{"category":"item","id":"3","price":3,"quantity":1},{"category":"item","id":"4","price":2,"quantity":1}]'
);
Diese teure Abfrage löst nicht mein Problem:
select
id,
b.value->>'id' as id_before,
b.value->>'category' as category_before,
b.value->>'price' as price_before,
b.value->>'quantity' as quantity_before,
a.value->>'id' as id_after,
a.value->>'category' as category_after,
a.value->>'price' as price_after,
a.value->>'quantity' as quantity_after
from t
CROSS JOIN json_array_elements(before) b
CROSS JOIN json_array_elements(after) a;