2017-04-06 3 views
2

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; 

Antwort

2

Sie die Ausnahme alle können den Unterschied zwischen Ihren beiden json zu bekommen, durch Damit können Sie herausfinden, welche Artikel hinzugefügt und gelöscht werden. Um den Unterschied zu finden, lautet meine Abfrage:

select 
value->>'id', 
value->>'category', 
value->>'price', 
value->>'quantity' 
FROM 
    json_array_elements(before) 
EXCEPT ALL 
select 
value->>'id', 
value->>'category', 
value->>'price', 
value->>'quantity' 
FROM 
    json_array_elements(after)