【发布时间】:2011-12-02 18:12:19
【问题描述】:
我正在使用以下查询:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
将列的数据类型从character(20) 更改为numeric(10,0),但出现错误:
列“代码”不能转换为数字类型
【问题讨论】:
标签: postgresql
我正在使用以下查询:
ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0);
将列的数据类型从character(20) 更改为numeric(10,0),但出现错误:
列“代码”不能转换为数字类型
【问题讨论】:
标签: postgresql
你可以试试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 失败,您必须在更改列类型之前手动清理非数字数据。
【讨论】:
TYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
如果您的 VARCHAR 列包含空字符串(您可能还记得,这与 PostgreSQL 的 NULL 不同不相同)您将不得不使用以下行中的内容来设置默认值:
ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
(在this answer的帮助下找到)
【讨论】:
第 1 步:根据您的要求添加带有整数或数字的新列
第 2 步:将数据从 varchar 列填充到数字列
第 3 步:删除 varchar 列
第 4 步:根据旧的 varchar 列更改新的数字列名称
【讨论】: