Posterior a indagar en diversos repositorios y páginas webs finalmente hemos dado con la solución que te mostramos ahora.
Solución:
Hay dos operaciones para obtener valor de JSON
. El primero ->
regresará JSON
. El segundo ->>
devolverá el texto.
Detalles: funciones y operadores JSON
Probar
SELECT (json_data->'position'->>'lat')::float + 1.0 AS lat
FROM updates
LIMIT 5
AFAIK no hay json->float casting en Postgres, por lo que podría probar un explícito (json_data->'position'->'lat')::text::float
emitir
Por documentación, también están las funciones.
jsonb_populate_record()
jsonb_populate_recordset()
Análogo a sus gemelos json (presentes desde la página 9.3)
json_populate_record()
json_populate_recordset()
Necesita un tipo de fila predefinido. Utilice el tipo de fila de una tabla existente o defina uno con CREATE TYPE
. O sustituir con una tabla temporal ad hoc:
CREATE TEMP TABLE x(lat float);
Puede ser una sola columna o una larga lista de columnas.
Sólo se rellenan aquellas columnas en las que el nombre coincide con un key en el json
objeto. los valor es coaccionado a la columna escribe y tiene que ser compatible o se genera una excepción. Otro keys son ignorados.
SELECT lat + 1 -- no need for 1.0, this is float already
FROM updates u
, jsonb_populate_record(NULL::x, u.json_data->'position')
LIMIT 5;
Usando un implícito LATERAL JOIN
aquí.
Del mismo modo, utilice jsonb_populate_recordset()
para descomponer matrices en varias filas por entrada.
Esto funciona de la misma manera en Postgres 9.3 con json
. Existe la ventaja añadida de que transmitir a/desde text
internamente no es necesario para datos numéricos en jsonb
.
No se te olvide recomendar esta crónica si te ayudó.