example - rails postgresql jsonb
Cómo agrupar/seleccionar columna de tipo JSON(PG:: Función no definida: ERROR: no se pudo identificar un operador de igualdad para el tipo json) (2)
Yo quiero hacer
<MODEL>.select("brief_content").group("brief_content")
Aquí está el esquema de la mesa,
:id => :integer,
:content => :json,
:brief_content => :json
Pero tengo los errores,
Como puedo hacerlo, gracias
companyAlarmLog Load (0.9ms) SELECT company_alarm_logs.id, company_alarm_logs.name, company_alarm_logs.utc_time, company_alarm_logs.company_alarm_test_id, company_alarm_logs.brief_content, brief_content FROM "company_alarm_logs" GROUP BY brief_content ORDER BY utc_time
E, [2014-06-24T09:40:39.069988 #954] ERROR -- : PG::UndefinedFunction: ERROR: could not identify an equality operator for type json
LINE 1: ...t, brief_content FROM "company_alarm_logs" GROUP BY brief_cont...
^
: SELECT company_alarm_logs.id, company_alarm_logs.name, company_alarm_logs.utc_time, company_alarm_logs.company_alarm_test_id, company_alarm_logs.brief_content, brief_content FROM "company_alarm_logs" GROUP BY brief_content ORDER BY utc_time
Hirb Error: PG::UndefinedFunction: ERROR: could not identify an equality operator for type json
LINE 1: ...t, brief_content FROM "company_alarm_logs" GROUP BY brief_cont...
Desafortunadamente no hay una forma simple de hacer pruebas de igualdad json
directas en 9.3.
El tipo json
9.3 no tiene operador de igualdad, porque acepta json con claves duplicadas (como muchas implementaciones esperan). No está claro si {"a":1, "a":2}
es "igual" a {"a":1}
o no.
9.4 agrega jsonb
que colapsa las claves duplicadas en base a la última clave gana, haciendo que la igualdad sea 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)
Desafortunadamente, esto significa que no puedes hacer lo que quieras simplemente en 9.3.
Podrías escribir un operador de igualdad personalizado para json
, tal vez simplemente enviar ambos al texto y comparar 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 de JavaScript V8 para realizar la comparación de igualdad.
Defina un operador de igualdad para json
, luego defina una clase de árbol b simple usando ese operador. Ambos son simples de hacer en el nivel SQL - vea CREATE OPERATOR
y CREATE OPERATOR CLASS
.
Una vez que hayas hecho eso, podrás agrupar los valores json en 9.3.
O simplemente puedes instalar 9.4 beta1 y usar jsonb
.
.group(''brief_content:text'')
debería hacer el truco. De todos modos, puede no ser exacto, cuando los campos tienen un orden diferente en json serializado. En los rieles esto no debería ser un problema.