query - row_to_json postgresql example
postgresql usando el sub-elemento json en la cláusula where (2)
Esta podría ser una pregunta muy básica, pero no puedo encontrar nada en línea.
Si creo una tabla de muestra:
create table dummy ( id int not null, data json );
Luego, si consulta la tabla utilizando la siguiente consulta:
select * from dummy where data->''x'' = 10;
Ahora, como no hay registros en la tabla todavía y no hay ninguna propiedad tal como ''x'' en ningún registro, debería devolver cero resultados.
Pero me sale el siguiente error:
postgres=# select * from dummy where data->''x'' = 10;
ERROR: operator does not exist: json = integer
LINE 1: select * from dummy where data->''x'' = 10;
Sin embargo, la siguiente consulta funciona:
select * from dummy where cast(data->>''x'' as integer) = 10;
¿Me estoy perdiendo algo aquí o el encasillado es la única forma en que puedo obtener un valor entero de un campo json? Si ese es el caso, ¿no afecta el rendimiento cuando los datos se vuelven extremadamente grandes?
¿Me estoy perdiendo algo aquí o el encasillado es la única manera de obtener un valor entero de un campo json?
Estás en lo correcto, la conversión de tipos es la única forma de leer un valor entero de un campo json.
Si ese es el caso, ¿no afecta el rendimiento cuando los datos se vuelven extremadamente grandes?
Postgres le permite indexar funciones, incluidas las conversiones, por lo que el siguiente índice le permitirá recuperar rápidamente todas las filas donde los datos - >> x tiene algún valor entero
CREATE INDEX dummy_x_idx ON dummy(cast("data"->>''x'' AS int))
Operador JSON ->>
significa obtener el elemento de la matriz JSON (o campo de objeto) como texto , por lo que es necesario escribir cast.
Podría definir su propio operador JSON, pero solo simplificaría el código, sin consecuencias para el rendimiento.