Postgresql

Postgresql json 列查看

  • July 7, 2020

我有一張看起來像這樣的桌子

id |   json_column
---+------------
1 | {"text1":"a", "text2":"b", "text3":"c", ....}
2 | {"text1":"b", "text2":"c", ....}

我希望它是這樣的

text1 | text2 | text3 | ....
a     | b     | c     | ....
b     | c     | d     | ....

我發現獲得此結果的一個變體是使用 json_populate_record() 並創建一個新類型 x 作為 (text1 text, text2 text, text3 text,….) 所以我可以執行

select (json_populate_record(null::x, json_column)).* from table

有沒有另一種方法可以在不創建上述類型的情況下做到這一點?所有新列都可以具有文本類型,那麼可能有快捷方式嗎?

我的問題是我在一個 json 欄位中以 aaaa_bbbb_cccc_d 的形式有 50 個鍵,因此手動為此創建一種類型需要很長時間

我正在使用 9.5.4

沒有辦法讓您免於在選擇列表中指定所有 JSON 屬性,無論是通過“虛擬類型”隱式還是顯式,例如使用類似這樣的東西:

select json_column ->> 'text1' as text1, 
      json_column ->> 'text2' as text2, 
      ... 
from the_table;

可以做的是通過基於 JSON 文件中的不同屬性自動創建具有所有屬性的視圖來簡化此操作。

以下程式碼將使用 JSON 列中的所有不同鍵重新創建一個視圖:

do
$$
declare
 l_keys text;
begin
  drop view if exists v_json_view cascade;

  select string_agg(distinct format('json_column ->> %L as %I',jkey, jkey), ', ')
    into l_keys
  from the_table, json_object_keys(json_column) as t(jkey);

  execute 'create view v_json_view as select '||l_keys||' from the_table';
end;
$$
;

每次所有 json 文件中的鍵列表發生更改時,您都需要執行上述命令。理論上這可以在觸發器中完成,但如果您在該表上執行許多更新,這可能不是一個好主意。

如果 JSON 鍵的總數有點“穩定”,您可以安排一個 cron 作業以定期重新創建該視圖。

您還受到表或視圖中最大列數的限制。如果您有比大約更多(不同的)鍵。1600(可能更少)以上失敗。

引用自:https://dba.stackexchange.com/questions/151838