如果我有一个 varchar 类型的字段(并且所有值都是 null 或数字的字符串表示形式),我如何使用 alter table 将此列类型转换为 bigint?
问问题
70043 次
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 回答