如何在 PostgreSQL 8.4中将列数据类型从字符更改为数字

我使用以下查询:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);

将列的数据类型从 character(20)改为 numeric(10,0),但我得到了一个错误:

列“代码”不能强制转换为数字类型

239311 次浏览

你可以尝试使用 USING:

可选的 USING子句指定如何从旧数据类型计算新列值; 如果省略,则默认转换与从旧数据类型转换为新数据类型的赋值相同。如果没有从旧类型转换为新类型的隐式转换或赋值,则必须提供 USING子句。

因此,这可能会奏效(取决于你的数据) :

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

如果 code中有任何内容无法强制转换为数值,则此操作将失败; 如果 USING 失败,则必须在更改列类型之前手动清除非数值数据。

如果您的 VARCHAR列包含空字符串(您可能还记得,这些字符串与 PostgreSQL 的 NULL相同) ,那么您必须使用以下行中的内容来设置默认值:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

(在 这个答案的帮助下找到)

步骤1: 按照您的要求添加带有整数或数字的新列

步骤2: 将数据从 varchar 列填充到数值列

步骤3: 删除 varchar 列

步骤4: 根据旧的 varchar 列更改新的数字列名