Helaas is er geen eenvoudige manier om direct json
te doen gelijkheidstests in 9.3.
9.3's json
type heeft geen gelijkheidsoperator, omdat het json met dubbele sleutels accepteert (zoals veel implementaties verwachten). Het is niet duidelijk of {"a":1, "a":2}
is "gelijk" aan {"a":1}
of niet.
9.4 voegt jsonb
toe die dubbele sleutels samenvouwt op een last-key-wins-basis, waardoor gelijkheid ondubbelzinnig wordt.
regress=# SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
ERROR: operator does not exist: json = json
LINE 1: SELECT '{"a":1, "a":2}'::json = '{"a":1}'::json;
^
HINT: No operator matches the given name and argument type(s). You might need to add explicit type casts.
regress=# SELECT '{"a":1, "a":2}'::jsonb = '{"a":1}'::jsonb;
?column?
----------
f
(1 row)
Helaas betekent dit dat je niet zomaar kunt doen wat je wilt in 9.3.
U kunt een aangepaste operator voor gelijkheid schrijven voor json
- misschien gewoon beide naar tekst casten en op die manier vergelijken, maar dat zou {"a":1, "b":2}
behandelen en {"b":2, "a":1}
als ongelijk.
Een betere optie zou zijn om PL/V8 te installeren en de json-bewerkingen van de V8 JavaScript-engine te gebruiken om de gelijkheidsvergelijking uit te voeren.
Definieer een gelijkheidsoperator voor json
, definieer vervolgens een eenvoudige b-tree opklasse met behulp van die operator. Beide zijn eenvoudig te doen op SQL-niveau - zie CREATE OPERATOR
en CREATE OPERATOR CLASS
.
Zodra je dat hebt gedaan, kun je GROUP BY
json-waarden in 9.3.
Of je kunt gewoon 9.4 beta1 installeren en jsonb
. gebruiken .