PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come raggruppare/selezionare la colonna di tipo JSON (PG::UndefinedFunction:ERROR:impossibile identificare un operatore di uguaglianza per il tipo json)

Sfortunatamente non esiste un modo semplice per eseguire direttamente json test di uguaglianza in 9.3.

json di 9.3 type non ha un operatore di uguaglianza, perché accetta json con chiavi duplicate (come si aspettano molte implementazioni). Non è chiaro se {"a":1, "a":2} è "uguale" a {"a":1} oppure no.

9.4 aggiunge jsonb che comprime le chiavi duplicate in base all'ultima chiave vincente, rendendo l'uguaglianza inequivocabile.

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)

Sfortunatamente, questo significa che non puoi fare quello che vuoi semplicemente in 9.3.

Potresti scrivere un operatore di uguaglianza personalizzato per json - forse solo trasmettere entrambi al testo e confrontare in quel modo, ma tratterebbe {"a":1, "b":2} e {"b":2, "a":1} come disuguale.

Un'opzione migliore sarebbe installare PL/V8 e utilizzare le operazioni json del motore JavaScript V8 per eseguire il confronto di uguaglianza.

Definisci un operatore di uguaglianza per json , quindi definisci una semplice opclass b-tree usando quell'operatore. Entrambi sono semplici da fare a livello SQL - vedi CREATE OPERATOR e CREATE OPERATOR CLASS .

Una volta fatto, sarai in grado di GROUP BY json valori in 9.3.

Oppure potresti semplicemente installare 9.4 beta1 e usare jsonb .