[英]Update column from integer[] to jsonb[]
首先,為此我使用 Elixir (Ecto),但我認為我最好在遷移時運行原始 SQL 語句。
我有一列是整數數組; 由於需求更改,我需要將此整數數組轉換為對象數組,在本例中為jsonb[]
。 這對我來說看起來不太合適,因為從integer[]
轉換為jsonb[]
是不可能的(至少不是自動的)
我一直在嘗試同時轉換這兩種類型,但它只是沒有結果; 我什至嘗試轉換為字符串然后轉換為 jsonb 但這似乎不起作用。
現在我正在尋找最好的方法來做到這一點,而不是最簡單的,只是最好或正確的方法來做到這一點。 我正在考慮創建一個臨時列,從那里的舊列中復制值並重命名? 什么是正確的 SQL 聲明?
USING column_name::jsonb[]
說一句,我也被這個提示hint: You might need to specify "USING table_name::jsonb[]"
CAST (column_name as jsonb)
.
如果它像我認為的那樣簡單,它可以與ALTER TABLE table_name ALTER COLUMN column_name TYPE jsonb[] USING column_name::jsonb[]
。 如果我沒有提供足夠的信息,請告訴我,謝謝。
一種選擇是使用array_to_json()
然后轉換為 jsonb 或只是to_jsonb()
:
select x.*, array_to_json(ari)::jsonb,
to_jsonb(ari)
from (select array[1, 2, 3] as ari) x;
如果要更改類型,請使用alter table
:
alter table t alter column ari type jsonb using to_jsonb(ari);
這是一個 db<>fiddle。
下面的構造將用於從 INT[] 獲取 JSONB[]。 但從技術上講,你得到的不是 JSON對象的數組(專門指類似哈希表的東西),它只是一個 JSON 東西的數組,每個都包含一個“Z0ECD11C1D7A28742F8ZD14”類型的標量。 如果那不是您想要的,您將不得不描述您想要的。
ALTER TABLE table_name ALTER COLUMN column_name TYPE jsonb[] USING column_name::text::jsonb[]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.