2014-11-24 2 views
1

У меня есть десятичное значение, хранящееся в виде строки в столбце JSON:Извлечение JSON строку и отливать в десятичную

{"path": {"to": {"decimal": "123.45"}}} 

можно извлечь десятичное значение с помощью #> оператора:

SELECT foo #> '{path,to,decimal}' 
FROM (
    SELECT '{"path": {"to": {"decimal": "123.45"}}}'::json AS foo 
) AS footable 

Но результатом является типа JSON:

"123.45" 

Если я ок го его числовая:

SELECT (foo #> '{path,to,decimal}')::numeric 
FROM (
    SELECT '{"path": {"to": {"decimal": "123.45"}}}'::json AS foo 
) AS footable 

Я получаю ошибку:

cannot cast type json to numeric 

Если я бросил его в текст и затем числовой:

SELECT (foo #> '{path,to,decimal}')::text::numeric 
FROM (
    SELECT '{"path": {"to": {"decimal": "123.45"}}}'::json AS foo 
) AS footable 

текст Строка цитируется, которая не сбрасывает t о цифровом:

invalid input syntax for type numeric: ""123.45"" 

Что такое правильный способ для извлечения значения из структуры JSON, и получить значение в качестве не- JSon типа?

+0

Ваш JSON не так, почему бы не вставить { "путь": { "к": { "десятичный": 123,45}}} вместо { "путь": { "к": {"decimal": "123.45"}}} (обратите внимание на цитаты около 123.45) –

+0

Цель сохранения десятичного числа в виде строки - это точная точность. – cpburnz

ответ

8

Вот мое решение:

SELECT (foo #>> '{path,to,decimal}')::numeric 
FROM (
    SELECT '{"path": {"to": {"decimal": "123.45"}}}'::json AS foo 
) AS footable 

Обратите внимание на #>> operator для извлечения значения как text (и избежать какого-либо странного неявного приведения).

Here is the SQLFiddle.

Смежные вопросы