34

可能重复:
如何在 postgresql 8.4 中将列数据类型从字符更改为数字

如果我有一个 varchar 类型的字段(并且所有值都是 null 或数字的字符串表示形式),我如何使用 alter table 将此列类型转换为 bigint?

4

3 回答 3

94

只需通过解析字符串(强制转换)进行转换:

alter table the_table alter column the_column type bigint using the_column::bigint

事实上,您可以使用任何表达式来the_column代替而不是the_column::bigint自定义转换。

请注意,这将重写表格,甚至在完成之前锁定读者。

于 2012-12-10T21:49:19.270 回答
5

您可以创建一个临时类型的列bigint,然后像这样执行 SQL

UPDATE my_table SET bigint_column=varchar_column::bigint;

然后删除您的 varchar_column 并重命名 bigint_column。这有点迂回,但不需要在 postgres 中进行自定义转换。

于 2012-12-10T21:12:17.350 回答
0

如何在 postgresql 中将字符串列类型转换为数字或 bigint

设计您自己的从字符串到 bigint 的自定义转换。像这样的东西:

CREATE OR REPLACE FUNCTION convert_to_bigint(v_input text)
RETURNS BIGINT AS $$
DECLARE v_bigint_value BIGINT DEFAULT NULL;
BEGIN
    BEGIN
        v_bigint_value := v_input::BIGINT;
    EXCEPTION WHEN OTHERS THEN
        RAISE NOTICE 'Invalid bigint value: "%".  Returning something else.', v_input;
        RETURN 0;
    END;
RETURN v_bigint_value;
END;

然后创建一个fixed_table_with_bigint与旧表具有相同参数的新表,只是将字符串列更改为 bigint 列。

然后将前一个表中的所有行(使用自定义 cast convert_to_integer)插入到新表中:

insert into fixed_table_with_bigint
select mycolumn1, 
       convert_to_bigint(your_string_bigint_column),
       mycolumn3
    from incorrect_table

您可能必须进行修改convert_to_bigint才能处理不是数字、空白字符串、空值、控制字符和其他怪异的字符串。

然后删除第一个表并将第二个表重命名为第一个表。

于 2012-12-10T21:07:13.967 回答