我有一个 Postgres 表,它有一个字段 KPI,其中包含一个 JSON 对象。它包含一年中每周的数据。我想返回本周包含的值,在本例中 w5
始终是 JSON 中的最后一项。
从 KPI 字段中提取
{
"details":{
"w52":{
"sales-goal":96.0,
"sales":81.2,
"forecast-goal":96.0,
"forecast":83.6
},
"w3":{
"sales-goal":96.0,
"sales":85.8,
"forecast-goal":96.0,
"forecast":85.7
},
"w4":{
"sales-goal":96.0,
"sales":86.3,
"forecast-goal":96.0,
"forecast":86.1
},
"w5":{
"sales-goal":96.0,
"sales":86.6,
"forecast-goal":96.0,
"forecast":86.0
}
}
}
这是我的 SQL
SELECT
kpi->'details'::json #>>(json_array_length(col->'details'::json)-1)#>> '{sales-goal}'::text[] as Sales Goal,
kpi->'details'::json #>>(json_array_length(col->'details'::json)-1)#>> '{sales}'::text[] as Sales
FROM areas
我收到以下错误消息:
ERROR: invalid input syntax for type json Detail: Token "details" is invalid. Position: 14 Where: JSON data, line 1: details
我正在努力得到这个结果。
Sales Goal | Sales
-----------------+------------------------
96.0 | 86.6
答案 0 :(得分:1)
如果您想始终获取最后一个条目(而不是特定的 w5
元素):
实际上,无法保证 JSON 对象中元素的特定顺序。如果您想冒险,这可能是一个解决方案:
SELECT
elems.value ->> 'Sales Goal' as sales_goal,
elems.value ->> 'Sales' as sales -- 3
FROM mytable,
json_each(kpi) WITH ORDINALITY as elems(value, index) -- 1
ORDER BY elems.index DESC -- 2
LIMIT 1