Sql 博士后jsonb。异构json字段

Sql 博士后jsonb。异构json字段,sql,json,postgresql,Sql,Json,Postgresql,如果我有一个带有单个jsonb列的表,并且该表有如下数据: [{"body": {"project-id": "111"}}, {"body": {"my-org.project-id": "222"}}, {"body": {"other-org.project-id": "333"}}] select data->'body'->'project-id' projectid from mytable 基本上,它为不同的行存储不同的项目id。 现在我需要一个查询,其中

如果我有一个带有单个jsonb列的表,并且该表有如下数据:

 [{"body": {"project-id": "111"}},
  {"body": {"my-org.project-id": "222"}},
  {"body": {"other-org.project-id": "333"}}]
select data->'body'->'project-id' projectid from mytable
基本上,它为不同的行存储不同的项目id。 现在我需要一个查询,其中来自不同行的
数据->'body'>'etc.
将合并到单个字段
'project-id'
,我该如何做

e、 g:如果我这样做:

 [{"body": {"project-id": "111"}},
  {"body": {"my-org.project-id": "222"}},
  {"body": {"other-org.project-id": "333"}}]
select data->'body'->'project-id' projectid from mytable
它将返回如下内容:

| projectid |
|       111 |
但我也希望其他行中也有项目id,但我不希望结果中有其他列。i、 e,我想要这个:

| projectid |
|       111 |
|       222 |
|       333 |

我知道您的每一行都包含一个json对象,其中包含一个嵌套对象,其键随行而变化,并且您希望获取其值

假设
“body”
始终只有一个键,您可以执行以下操作:

select jsonb_extract_path_text(t.js -> 'body', x.k) projectid
from t
cross join lateral jsonb_object_keys(t.js -> 'body') as x(k)
jsonb\u object\u keys()
上的横向连接将对象中的所有键提取为行。然后我们使用
jsonb\u extract\u path\u text()
获得相应的值

with t as ( 
  select '{"body": {"project-id": "111"}}'::jsonb js
  union all select '{"body": {"my-org.project-id": "222"}}'::jsonb
  union all select '{"body": {"other-org.project-id": "333"}}'::jsonb
)
select jsonb_extract_path_text(t.js -> 'body', x.k) projectid
from t
cross join lateral jsonb_object_keys(t.js -> 'body') as x(k)
|投射| | :--------- | | 111 | | 222 | | 333 |
您能展示您期望得到的输出吗?您是说您已经将整个数组作为jsonb值存储在某行的一列中,还是这实际上表示三行,每行都有一个对象jsonb值?请提供设置示例数据集的SQL语句。