簡體   English   中英

如何從 Postgres 的 json 列中提取鍵和值?

[英]How to extract key and value from json column in Postgres?

我想使用 Postgresql 將從 json 列中提取的鍵值對添加到表中。

我在 json 中有一個帶有 uid 和 data 列的 items_table 多對。 看起來像的初始表:

uid | data

1   | {"item1":"string1", "item2":"string2"}
2   | {"item2":"string3", "item5":"string1", "item7":"string5"}
3   | {"item1":"string3", "item4":"string1", "item6":"string8", "item5":"string5"}
4   | {"item1":"string4"}

...

因此,某些項目/字符串可以重復,字段長度也可以變化。

我嘗試應用文檔中提到的 jsonb_object_keys,但是出現錯誤。

     select jsonb_object_keys(data) 
     from items_table;

錯誤函數 jsonb_object_keys(字符變化)不存在提示:沒有函數匹配給定的名稱和參數類型。 您可能需要添加顯式類型轉換

我想通過以下方式獲得表結果以按項目和字符串拆分,擴展 uid 列:

uid | items      | strings

1   | item1      | string1
1   | item2      | string2
2   | item2      | string3
2   | item5      | string1
2   | item7      | string5
3   | item1      | string3
3   | item4      | string1
3   | item6      | string8
3   | item5      | string5
4   | item1      | string4

如何實現上述輸出?

您應該能夠提取鍵,然后提取值:

select key, v.j->key
from (values (1, '{"item1":"string1", "item2":"string2"}'::jsonb),
             (2, '{"item2":"string3", "item5":"string1", "item7":"string5"}'::jsonb)
     ) v(id, j) cross join lateral
     jsonb_object_keys(v.j) as key;

是一個 db<>fiddle。

您可以使用json_each_text()方法輕松地將jsonb類型列拆分為兩個單獨的列:

select uid, (js).key as items, (js).value as strings
  from
  (
   select uid, jsonb_each_text(data) as js
     from tab
  ) q 

或更直接地使用cross join

select uid, js.items, js.value as strings
  from tab
 cross join jsonb_each_text(data) as js(items)

演示

暫無
暫無

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

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