【问题标题】:Retrieve values from the last object in a JSON object in Postgres从 Postgres 中 JSON 对象的最后一个对象中检索值
【发布时间】:2021-02-16 13:52:00
【问题描述】:

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

【问题讨论】:

  • 你没有数组,所以jsonb_array_length() 将无法开始工作。如果您知道w5 是您要查找的内容,请使用kpi #>> '{details,w5,sales}'

标签: sql json postgresql


【解决方案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. 将“最后一个”(参见上面的通知!)元素置于顶部并将输出限制为一个以仅返回“最后一个”记录
  3. 返回值。

【讨论】:

    猜你喜欢
    • 2013-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多