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
.