functions example ejemplo sql postgresql casting jsonb postgresql-9.4

example - Cómo convertir el tipo jsonb de PostgreSQL 9.4 a flotar



postgresql json example (5)

Estoy intentando la siguiente consulta:

SELECT (json_data->''position''->''lat'') + 1.0 AS lat FROM updates LIMIT 5;

(El +1.0 está justo ahí para forzar la conversión a flotación. Mis consultas reales son mucho más complejas, esta consulta es solo un caso de prueba para el problema).

Me sale el error

ERROR: operator does not exist: jsonb + numeric

Si añado en el casting explícito:

SELECT (json_data->''position''->''lat'')::float + 1.0 AS lat FROM updates LIMIT 5;

el error se convierte en:

ERROR: operator does not exist: jsonb + double precesion

Entiendo que la mayoría de los valores jsonb no se pueden convertir en valores flotantes, pero en este caso, sé que todos los números son números JSON.

¿Existe una función que convierte los valores jsonb en flotantes (o devuelve NULL para lo que no se puede colocar)?


AFAIK no hay json-> float casting en Postgres, así que puedes probar un explícito (json_data->''position''->''lat'')::text::float cast


Agregar una aclaración porque esto se presenta como el principal éxito para una búsqueda de ''conversión flotante JSONB''; tenga en cuenta que debe ajustar la conversión JSON entre paréntesis y luego aplicar la conversión ''::''.

Como se mencionó anteriormente, el método correcto es:

(json_data #>> ''{field}'')::float

Si por el contrario intentas esto, fallará:

json_data #>> ''{field}''::float

Este fue el error que estaba cometiendo en mi código y me tomó un tiempo verlo, una solución fácil una vez que me di cuenta.


Debes convertir el valor json en texto y luego flotar.

Prueba esto:

(json_data #>> ''{field}'')::float


Hay dos operaciones para obtener valor de JSON . El primero -> devolverá JSON . El segundo ->> devolverá el texto.

Detalles: Funciones y Operadores JSON

Tratar

SELECT (json_data->''position''->>''lat'')::float + 1.0 AS lat FROM updates LIMIT 5


Por documentación , también están las funciones.

jsonb_populate_record() jsonb_populate_recordset()

Analógico a sus gemelos json (presente 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.

Solo se llenan esas columnas, donde el nombre coincide con una clave en el objeto json . El valor se aplica al tipo de columna y debe ser compatible o se genera una excepción. Otras claves son ignoradas.

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 una ÚNICA LATERAL JOIN aquí.

De manera similar, use jsonb_populate_recordset() para descomponer arreglos en múltiples filas por entrada.

Esto funciona de la misma manera en Postgres 9.3 con json . Existe la ventaja añadida de que la conversión a / desde text internamente no es necesaria para datos numéricos en jsonb .