PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So gruppieren/wählen Sie eine Spalte vom Typ JSON aus (PG::UndefinedFunction:ERROR:konnte keinen Gleichheitsoperator für den Typ json identifizieren)

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 .