json - 展开 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
有什么建议吗?
解决方案
缺少的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)
推荐阅读
- firefox - 无法在 firefox 附加输入字段中键入斜杠或单引号
- mysql - 如何在 MYSQL 查询中使用聚合函数连接表?
- javascript - 尝试使用 React 检索 API 数据时出现问题
- python-3.x - 在 Pandas 中插入组内的缺失值
- json - 如何使用 JavaScript 正则表达式返回数组中的对象?
- c# - System.Action 是内部数组吗?+= 和 -= 运算符的效率
- json - Coldfusion 将 cfhttp.filecontent 解析为列表
- selenium - 这个报告的 Safari 13 Selenium 问题是否有任何进展、更新和解决方法?
- ruby-on-rails - Ruby on Rails:从 activerecord 查询创建数组
- ionic3 - Ionic 3.20 和 googlemaps 插件