将JSON列更改为INTEGER [] ARRAY

时间:2014-02-24 19:12:47

标签: sql arrays json postgresql

我有一个包含整数数组的JSON列。我试图将它转换为INTEGER []列,但我遇到了投射错误。

这是我最后的改版版本:

ALTER TABLE namespace_list ALTER COLUMN namespace_ids TYPE INTEGER[] USING string_to_array(namespace_ids::integer[], ',');

但是,这会引发此错误: ERROR: cannot cast type json to integer[]

我有什么想法可以解释这种转换?我尝试了几件事,但我最终得到了同样的错误。好像去了json - > string - > - >数组不起作用。我有什么选择?

修改

表格定义:

db => \d+ namespace_list;

Column         |   Type   |  Table "kiwi.namespace_list" Modifiers|
---------------+----------+--------------------------------------+
id             | integer  | not null default nextval('namespace_list_id_seq'::regclass)
namespace_ids  | json     | not null default '[]'::json

示例数据:

id | namespace_ids | 
-------------------+
1 | [1,2,3]        |

1 个答案:

答案 0 :(得分:3)

如果您的数组中没有无效字符,则可以完成此任务:

ALTER TABLE namespace_list
ALTER COLUMN namespace_ids TYPE INTEGER[]
      USING translate(namespace_ids::text, '[]','{}')::int[];

-> SQLfiddle

具体的困难是你不能在USING子句中有一个子查询表达式,所以不需要&重新聚合不是一个选项

SELECT ARRAY(SELECT(json_array_elements(json_col)::text::int))
FROM   namespace_list;

因此,我使用字符串操作为整数数组生成一个有效的字符串常量并将其强制转换。

DEFAULT

评论中的每个请求
我最初自己构建了测试用例,因为缺少表定义。所以我在后面添加的实际表格定义中错过了default '[]'::json 解决方案:在执行上述操作之前删除列默认。我更新了小提琴。

ALTER TABLE namespace_list ALTER COLUMN namespace_ids DROP DEFAULT;

如果您需要,可以在之后添加新的DEFAULT。在同一笔交易中最好,所以不要错过任何东西。