从 Postgres 中 JSON 对象的最后一个对象中检索值

时间:2021-02-16 13:52:00

标签: sql json postgresql

我有一个 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

1 个答案:

答案 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
  1. 将 JSON 元素扩展为每个元素一个记录。添加索引以便在下一步中对它们进行排序
  2. 将“last”(见上面的通知!)元素排序到顶部并将输出限制为一个以仅返回“last”记录
  3. 返回值。
相关问题