sql >> Base de Datos >  >> RDS >> PostgreSQL

Cómo agrupar/seleccionar una columna de tipo JSON (PG::UndefinedFunction:ERROR:no se pudo identificar un operador de igualdad para el tipo json)

Desafortunadamente, no hay una manera simple de hacer json directo pruebas de igualdad en 9.3.

json de 9.3 type no tiene operador de igualdad, porque acepta json con claves duplicadas (como esperan muchas implementaciones). No está claro si {"a":1, "a":2} es "igual" a {"a":1} o no.

9.4 agrega jsonb que colapsa las claves duplicadas sobre la base de que la última clave gana, lo que hace que la igualdad no sea ambigua.

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)

Desafortunadamente, esto significa que no puedes hacer lo que quieras simplemente en 9.3.

Podría escribir un operador de igualdad personalizado para json - tal vez solo transmita ambos al texto y compare de esa manera, pero eso trataría {"a":1, "b":2} y {"b":2, "a":1} como desigual.

Una mejor opción sería instalar PL/V8 y usar las operaciones json del motor JavaScript V8 para realizar la comparación de igualdad.

Defina un operador de igualdad para json , luego defina una clase de operación de árbol b simple usando ese operador. Ambos son fáciles de hacer a nivel de SQL; consulte CREATE OPERATOR y CREATE OPERATOR CLASS .

Una vez que hayas hecho eso, podrás GROUP BY valores json en 9.3.

O simplemente puede instalar 9.4 beta1 y usar jsonb .