Infelizmente, não há uma maneira simples de fazer
json
direto testes de igualdade em 9.3. json
da versão 9.3 type não tem operador de igualdade, porque aceita json com chaves duplicadas (como muitas implementações esperam). Não está claro se {"a":1, "a":2}
é "igual" a {"a":1}
ou não. 9.4 adiciona
jsonb
que recolhe as chaves duplicadas com base na última chave ganha, tornando a igualdade inequívoca. 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)
Infelizmente, isso significa que você não pode fazer o que quiser simplesmente no 9.3.
Você pode escrever um operador de igualdade personalizado para
json
- talvez apenas transmitindo para texto e comparando dessa maneira, mas isso trataria {"a":1, "b":2}
e {"b":2, "a":1}
como desigual. Uma opção melhor seria instalar o PL/V8 e usar as operações json do mecanismo JavaScript V8 para realizar a comparação de igualdade.
Defina um operador de igualdade para
json
, defina uma opclass simples de árvore b usando esse operador. Ambos são simples de fazer no nível SQL - veja CREATE OPERATOR
e CREATE OPERATOR CLASS
. Depois de fazer isso, você poderá
GROUP BY
valores json em 9.3. Ou você pode simplesmente instalar o 9.4 beta1 e usar
jsonb
.