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

use*_*630 127 postgresql

我正在使用以下查询:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 
Run Code Online (Sandbox Code Playgroud)

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

列"代码"无法强制转换为数字类型

mu *_*ort 228

您可以尝试使用USING:

optional 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);
Run Code Online (Sandbox Code Playgroud)

如果你有任何code不能转换为数字的东西,这将失败; 如果USING失败,则必须在更改列类型之前手动清理非数字数据.

  • @muistooshort我从文档中看到它实际上是一个表达.这更有意义.这种类型的演员让我措手不及.我最终得到了`TYPE varchar(255)USING(substring(formertextcolumn from 1 for 255))` (3认同)
  • @ user728630:您必须删除FK,更改两列,然后再添加FK。您确实有一个测试数据库可用于生产数据库的备份,对吗? (2认同)
  • @funwhilelost这是一个[类型转换](http://www.postgresql.org/docs/current/static/sql-expressions.html#SQL-SYNTAX-TYPE-CASTS).链接的ALTER TABLE文档涵盖了可以与USING一起使用的内容. (2认同)

Pat*_*tru 6

如果VARCHAR列包含空字符串(这是一样的NULLPostgreSQL的,你可能还记得),您将在下面设置一个默认的行使用的东西:

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);
Run Code Online (Sandbox Code Playgroud)

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