[英]Postgres jsonb. Heterogenous json fields
如果我有一個包含單個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 |
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.