簡體   English   中英

將列從 integer[] 更新為 jsonb[]

[英]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.

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