如果我有一个带有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 |
我知道您的每一行都包含一个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()
来获得相应的值。
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 |