Postgresql
Postgresql json 列查看
我有一張看起來像這樣的桌子
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(可能更少)以上將失敗。