Как преобразовать тип 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