Postgres jsonb。异构json字段

问题描述 投票:0回答:1

如果我有一个带有single jsonb列的表,并且该表具有这样的数据:

 [{"body": {"project-id": "111"}},
  {"body": {"my-org.project-id": "222"}},
  {"body": {"other-org.project-id": "333"}}]

基本上,对于不同的行,项目ID的存储方式不同。现在,我需要一个查询,其中来自不同行的data->'body'->'etc'.将合并为单个字段'project-id',我该怎么做?

例如:如果我做这样的事情:

select data->'body'->'project-id' projectid from mytable

它将返回类似:

| projectid |
|       111 |

但是我也希望项目ID位于其他行中,但我不希望结果中有其他列。即,我想要这样:

| projectid |
|       111 |
|       222 |
|       333 |
sql json postgresql
1个回答
0
投票

我知道您的每一行都包含一个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_object_keys()上的横向连接将对象中的所有关键点提取为行。然后我们使用jsonb_extract_path_text()来获得相应的值。

Demo on DB Fiddle

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)
| projectid || :--------- || 111 || 222 || 333 |
© www.soinside.com 2019 - 2024. All rights reserved.