SQL:将列的数据类型从String更改为Numeric

时间:2013-01-17 10:39:48

标签: sql postgresql

我将在postgre中将列的数据类型从“character varying”更改为“bigint”。

旧列包含字符串“male”和“female”,现在我想将其更改为0或1,每个代表男性或女性。

我认为一个简单的Alter表... Alter Column没有解决这个问题,因为它不会做男性 - > 0,女性 - > 1转换。

有谁能让我知道最安全的方法是什么?

非常感谢。

4 个答案:

答案 0 :(得分:4)

要考虑的要点

  1. 当你打算用男性1和女性0时   为什么要使用bigint数据类型? BIT / TINYINT数据类型将起作用
  2. 在更改列的数据类型之前,   你需要将男性更新为1,将女性更新为0

答案 1 :(得分:1)

请注意,根据@ScottMarlowe,Postgres能够使用ALTER COLUMN提供更简单的映射。

在大多数RDBMS中,这也可以按如下方式完成:

  1. 创建一个包含Gender
  2. 整数分类的新临时列
  3. 使用CASE / WHEN将旧varchar映射到新INT
  4. 更新表
  5. DROP旧varchar列
  6. 将旧列添加回表格,这次使用新的数据类型
  7. 将数据从临时BIGINT列复制回新列
  8. 删除临时BIGINT列
  9. 您可能还需要处理无效映射 - 我已经使用案例ELSE完成了此操作。 正如@Madhivanan所建议的那样,使用BIGINT进行性别分类听起来有点过分。

    SQL Fiddle here

    -- Add new Column
    ALTER TABLE SomeTable ADD GenderTypeId BIGINT;
    
    -- Map old to new
    UPDATE SomeTable SET GenderTypeId = 
    CASE
       WHEN GenderVarchar = 'male' 
          THEN 0 
       WHEN  GenderVarchar = 'female' 
           THEN 1
       ELSE
          -1 -- Invalid source data
    END;
    
    -- Drop old
    ALTER TABLE SomeTable DROP COLUMN GenderVarchar;
    

    <强>更新

    如果您需要使用与原始列相同的列名,则还需要将旧列添加回来,这次使用新数据类型,然后再次复制数据。 (我给它一个新名字)

    ALTER TABLE SomeTable ADD Gender BIGINT;
    
    -- Copy the data across
    UPDATE SomeTable SET Gender = GenderTypeId;
    
    -- Drop the temporary column
    ALTER TABLE SomeTable DROP COLUMN GenderTypeId;
    

答案 2 :(得分:1)

你们都在为此做出很长的努力。这是一个简短的测试用例:

 create table test (username text, sex text); 
 insert into test values ('bob','male'),('sandra','female'),('stan','male'),('sue','male');
 select * from test;
 username |  sex   
 ----------+--------  
 bob      | male  
 sandra   | female  
 stan     | male  
 sue      | male 
 (4 rows)

 alter table test alter column sex type int using case when sex='male' then 0 when sex='female' then 1 end;

 select * from test;  
 username | sex 
 ----------+-----  
 bob      |   0  
 sandra   |   1  
 stan     |   0  
 sue      |   0 (4 rows)

答案 3 :(得分:0)

您必须先更新表格并将男性更改为0,将女性更改为1

然后你可以改变表...改变列