Leider gibt es keine einfache Möglichkeit, json
direkt auszuführen Gleichheitstests in 9.3.
9.3's json
type hat keinen Gleichheitsoperator, da es json mit doppelten Schlüsseln akzeptiert (wie viele Implementierungen erwarten). Es ist nicht klar, ob {"a":1, "a":2}
ist "gleich" {"a":1}
oder nicht.
9.4 fügt jsonb
hinzu die doppelte Schlüssel auf einer Last-Key-Wins-Basis reduziert, wodurch die Gleichheit eindeutig wird.
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)
Leider bedeutet dies, dass Sie in 9.3 nicht einfach tun können, was Sie wollen.
Sie könnten einen benutzerdefinierten Gleichheitsoperator für json
schreiben - Vielleicht einfach beide in Text umwandeln und auf diese Weise vergleichen, aber das würde {"a":1, "b":2}
behandeln und {"b":2, "a":1}
als ungleich.
Eine bessere Option wäre, PL/V8 zu installieren und die json-Operationen der V8-JavaScript-Engine zu verwenden, um den Gleichheitsvergleich durchzuführen.
Definieren Sie einen Gleichheitsoperator für json
, dann definieren Sie eine einfache B-Tree-Opclass mit diesem Operator. Beides ist auf SQL-Ebene einfach durchzuführen - siehe CREATE OPERATOR
und CREATE OPERATOR CLASS
.
Sobald Sie das getan haben, können Sie GROUP BY
verwenden json-Werte in 9.3.
Oder Sie könnten einfach 9.4 beta1 installieren und jsonb
verwenden .