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

时间:2011-10-07 05:25:51

标签: postgresql

我正在使用以下查询:

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

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

  

列“代码”无法强制转换为数字

3 个答案:

答案 0 :(得分:217)

您可以尝试使用USING

  

可选的USING子句指定如何从旧的计算新列值;如果省略,则默认转换与从旧数据类型转换为new的赋值相同。如果没有从旧类型到新类型的隐式或赋值转换,则必须提供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失败,则必须在更改列类型之前手动清理非数字数据。

答案 1 :(得分:6)

如果您的VARCHAR列包含空字符串(对于PostgreSQL,NULL相同),您可能需要使用以下内容:以下设置默认值:

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

(在this answer的帮助下找到)

答案 2 :(得分:0)

第1步:根据需要添加具有整数或数字的新列

第2步:将数据从varchar列填充到数字列

第3步:删除varchar列

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