PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como agrupar/selecionar a coluna do tipo JSON (PG::UndefinedFunction:ERROR:não foi possível identificar um operador de igualdade para o tipo json)


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 .