将列从integer []更新为jsonb []

时间:2019-11-15 19:05:16

标签: sql postgresql

首先,为此,我正在使用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[]一起使用。谢谢,如果我没有提供足够的信息,请告诉我。

2 个答案:

答案 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[]