Как преобразовать тип JSONB PostgreSQL 9.4 в float

Я пытаюсь выполнить следующий запрос:

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

(+1.0 просто есть, чтобы заставить преобразование плавать. Мои фактические запросы намного сложнее, этот запрос является просто тестовым случаем для проблемы.)

Я получаю сообщение об ошибке:

ERROR:  operator does not exist: jsonb + numeric

если я добавлю в явное приведение:

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

ошибка становится:

ERROR:  operator does not exist: jsonb + double precesion

Я понимаю, что большинство значений jsonb не могут быть брошены в поплавки, но в этом случае я знаю, что все латы JSON числа.

есть ли функция, которая приводит значения jsonb к поплавкам (или возвращает нули для uncastable)?

4 ответов


есть две операции, чтобы получить значение из JSON. Первый -> вернутся JSON. Второй ->> возвращает текст.

детали: функции и операторы JSON

попробовать

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

в документации, есть также функции

jsonb_populate_record()
jsonb_populate_recordset()

аналог их близнецов json (присутствует с pg 9.3)

json_populate_record()
json_populate_recordset()

вам нужен предопределенный тип строки. Либо используйте тип строки существующей таблицы, либо определите ее с помощью CREATE TYPE. Или заменить временной таблицей ad hoc:

CREATE TEMP TABLE x(lat float);

может быть один столбец или длинный список столбцов.

заполняются только те столбцы, где имя соответствует ключ на


AFAIK в Postgres нет JSON - >float-кастинга, поэтому вы можете попробовать явное (json_data->'position'->'lat')::text::float cast


вы должны привести значение json к тексту, а затем к плаванию.

попробуйте это:

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