首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Postgresql JSON使用WITH RECURSIVE

Postgresql JSON使用WITH RECURSIVE
EN

Stack Overflow用户
提问于 2020-03-21 15:19:57
回答 1查看 43关注 0票数 0

我的json是

代码语言:javascript
复制
[
  {
    "id": null,
    "st": "value1",
    "key": 1,
    "value": "i am calling from",
    "description": null
  },
  {
    "st": "value2",
    "key": 5,
    "value": "i am calling from",
    "description": null
  },

  {
    "id": 25,
    "st": "value3",
    "key": 1,
    "value": "i am calling from",
    "description": null
  }
]

我需要使用一个数字迭代id (仅当它为null且没有id键时),并返回与下面相同的json,即使缺少键(id)。它必须是自动生成id的,因为我从来不知道这个聚合中有多少个元素。

代码语言:javascript
复制
[
  {
    "id": 1,
    "st": "value1",
    "key": 1,
    "value": "i am calling from",
    "description": null
  },
  {
    "id": 2,
    "st": "value2",
    "key": 5,
    "value": "i am calling from",
    "description": null
  },
  {
    "id": 25,
    "st": "value3",
    "key": 1,
    "value": "i am calling from",
    "description": null
  }
]

我相信递归CTE是有效的,但是我找不到解决这个问题的方法。请帮帮忙

EN

回答 1

Stack Overflow用户

发布于 2020-03-21 18:21:21

您可以取消数组的嵌套,并将id的任何空值替换为数组索引。但是,这并不能保证ID是唯一的,因为可能存在已使用的数组索引。

代码语言:javascript
复制
select jsonb_agg(
          case 
            when t.d ->> 'id' is null then t.d||jsonb_build_object('id', t.idx)
            else t.d
          end
       )
from jsonb_array_elements('[
  {
    "id": null,
    "st": "value1",
    "key": 1,
    "value": "i am calling from",
    "description": null
  },
  {
    "st": "value2",
    "key": 5,
    "value": "i am calling from",
    "description": null
  },
  {
    "id": 25,
    "st": "value3",
    "key": 1,
    "value": "i am calling from",
    "description": null
  }
]'::jsonb) with ordinality as t(d,idx)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60785381

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档