簡體   English   中英

Postgres jsonb。 異構json字段

[英]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()來獲取對應的值。

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        |

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM