使用 PostgreSQL 分析和格式化 JSON

Analysing and formatting JSON using PostgreSQL

我有一个名为 api_details 的 table,我将下面的 JSON 值转储到 JSON 列 raw_data 中。 现在我需要根据这个 JSON 字符串制作一份报告, 预期输出 如下所示,

action_name.              sent_timestamp                           Sent. Delivered
campaign_2475             1600416865.928737 - 1601788183.440805.    7504. 7483
campaign_d_1084_SUN15_ex  1604220248.153903 - 1604222469.087918.   63095. 62961

下面是示例JSON OUTPUT

{
  "header": [
    "#0 action_name",
    "#1 sent_timestamp",
    "#0 Sent",
    "#1 Delivered"
    
  ],
  "name": "campaign - lifetime",
  "rows": [
    [
      "campaign_2475",
      "1600416865.928737 - 1601788183.440805",
      7504,
      7483
    ],
    [
      "campaign_d_1084_SUN15_ex",
      "1604220248.153903 - 1604222469.087918",
      63095,
      62961
    ],
    [
      "campaign_SUN15",
      "1604222469.148829 - 1604411016.029794",
      63303,
      63211 
    ]
  ],
  "success": true
}

我试过如下所示,但没有得到 results.I 可以使用 python 通过遍历行列表中的所有元素来完成。

但是在 PostgreSQL(版本 11)中有一个简单的解决方案吗?

SELECT raw_data->'rows'->0 
  FROM api_details

您可以使用JSONB_ARRAY_ELEMENTS()函数,例如

SELECT (j.value)->>0 AS action_name,
       (j.value)->>1 AS sent_timestamp,
       (j.value)->>2 AS Sent,
       (j.value)->>3 AS Delivered
  FROM api_details
 CROSS JOIN JSONB_ARRAY_ELEMENTS(raw_data->'rows') AS j

Demo

P.S。在这种情况下,raw_data 的数据类型假定为 JSONB,否则函数 raw_data->'rows' 中的参数应替换为 raw_data::JSONB->'rows' 以执行显式类型转换。