【发布时间】:2012-12-11 05:49:19
【问题描述】:
可能重复:
how to change column datatype from character to numeric in postgresql 8.4
如果我有一个 varchar 类型的字段(并且所有值都是 null 或数字的字符串表示形式),我如何使用 alter table 将此列类型转换为 bigint?
【问题讨论】:
标签: postgresql
可能重复:
how to change column datatype from character to numeric in postgresql 8.4
如果我有一个 varchar 类型的字段(并且所有值都是 null 或数字的字符串表示形式),我如何使用 alter table 将此列类型转换为 bigint?
【问题讨论】:
标签: postgresql
仅通过解析字符串进行转换(强制转换):
alter table the_table alter column the_column type bigint using the_column::bigint
其实你可以用the_column的任意表达式代替the_column::bigint来自定义转换。
请注意,这将重写表格,甚至在完成之前锁定读者。
【讨论】:
你可以创建一个bigint类型的临时列,然后像这样执行SQL
UPDATE my_table SET bigint_column=varchar_column::bigint;
然后删除您的 varchar_column 并重命名 bigint_column。这有点迂回,但不需要在 postgres 中进行自定义转换。
【讨论】:
设计您自己的从字符串到 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列。
然后将前一个表中的所有行(使用自定义转换 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 以处理不是数字、空白字符串、空值、控制字符和其他怪异的字符串。
然后删除第一张表,将第二张表重命名为第一张表。
【讨论】: