首页 > 解决方案 > 展开 Postgresql 嵌套数组 Json 字段

问题描述

我有一个表(log_table),在这个表中有一个嵌套数组 json 字段(活动)。通过使用这个活动字段,我想规范我的行。

日志表:

- id:long
- activities:json
- date:timestamp

示例活动字段:

[ 
   { 
      "actionType":"NOTIFICATION",
      "items":null
   },
   { 
      "actionType":"MUTATION",
      "items":[ 
         { 
            "id":387015007,
            "name":"epic",
            "value":{ 
               "currency":"USD",
               "amount":1.76
            }
         },
         { 
            "id":386521039,
            "name":"test",
            "value":{ 
               "currency":"USD",
               "amount":1.76
            }
         }
      ]
   }
]

作为查询,我尝试过:

select 
* 
from 
log_table l, 
json_array_elements(l.activities) elems,
json_array_elements(elems->'items') obj;

使用此查询,我收到如下错误:

ERROR:  cannot call json_array_elements on a scalar

有什么建议吗?

标签: jsonpostgresql

解决方案


缺少的items应该标记为[null],不是null。您可以使用 case 表达式来更正此问题,例如:

select elems->>'actionType' as action_type, obj
from log_table
cross join jsonb_array_elements(l.activities::jsonb) elems
cross join jsonb_array_elements(case elems->'items' when 'null' then '[null]' else elems->'items' end) obj

 action_type  |                                       obj
--------------+---------------------------------------------------------------------------------
 NOTIFICATION | null
 MUTATION     | {"id": 387015007, "name": "epic", "value": {"amount": 1.76, "currency": "USD"}}
 MUTATION     | {"id": 386521039, "name": "test", "value": {"amount": 1.76, "currency": "USD"}}
(3 rows)    

推荐阅读