首先,为此,我正在使用Elixir(Ecto),但我认为最好在迁移时运行原始SQL语句。
我有一列是整数数组;由于需求变更,我需要将此整数数组转换为对象数组,在这种情况下为jsonb[]
。这对我来说不太合适,因为从integer[]
到jsonb[]
的转换是不可能的(至少不能自动)
我一直在尝试同时转换这两种类型,但这并不是结果。我什至试图将其转换为字符串,然后转换为jsonb,但这似乎不起作用。
现在,我正在寻找执行此操作的最佳方法,而不是最简单的方法,而是执行此操作的最佳或正确方法。我正在考虑创建一个临时列,将旧列中的值复制到那里,然后重命名吗?什么是正确的SQL语句呢?
顺便说一句,我也hint: You might need to specify "USING table_name::jsonb[]"
也被这个提示打中了,但是使用USING column_name::jsonb[]
并不能解决问题,CAST (column_name as jsonb)
也没有。
如果它像我想的那样简单,可以与ALTER TABLE table_name ALTER COLUMN column_name TYPE jsonb[] USING column_name::jsonb[]
一起使用。谢谢,如果我没有提供足够的信息,请告诉我。
答案 0 :(得分:0)
一种选择是使用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);
Here是db <>小提琴。
答案 1 :(得分:0)
下面的构造将使您可以从INT []获得JSONB []。但是从技术上讲,您得到的不是JSON 对象数组(专门指哈希表,如事事小子),它只是一个JSON事事小数组,每个事例都包含标量类型为“数”。如果那不是您想要的,则必须描述您想要的。
ALTER TABLE table_name ALTER COLUMN column_name TYPE jsonb[] USING column_name::text::jsonb[]