代码之家  ›  专栏  ›  技术社区  ›  holden

如何将表列转换为其他数据类型

  •  6
  • holden  · 技术社区  · 14 年前

    我在Postgres数据库中有一个varchar类型的列,我想它是整数…现在我想更改它们,不幸的是,使用我的Rails迁移似乎不起作用。

    change_column :table1, :columnB, :integer
    

    它似乎输出了这个SQL:

    ALTER TABLE table1 ALTER COLUMN columnB TYPE integer
    

    所以我试着这样做:

    execute 'ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)'
    

    但在本例中,强制转换不起作用,因为某些列为空…

    有什么想法吗?

    错误:

    PGError: ERROR:  invalid input syntax for integer: ""
    : ALTER TABLE table1 ALTER COLUMN columnB TYPE integer USING CAST(columnB AS INTEGER)
    

    PtGRESV3.3

    2 回复  |  直到 14 年前
        1
  •  13
  •   ealdent    14 年前

    听起来问题在于您的表中有空字符串。您需要处理这些问题,可能需要使用案例陈述,例如:

    execute %{ALTER TABLE "table1" ALTER COLUMN columnB TYPE integer USING CAST(CASE columnB WHEN '' THEN NULL ELSE columnB END AS INTEGER)}

    更新:根据更新的问题完全重写。

        2
  •  2
  •   leonbloy    14 年前

    空值在这里不应该是问题。 告诉我们您的PostgreSQL版本和错误消息。 此外,为什么要引用标识符?请注意,未加引号的标识符被转换为小写(默认行为),因此查询中的“columnB”可能有问题-它首先出现引号,在转换中未加引号。

    更新:在将列转换为整数之前,必须确保所有值都是可转换的。在这种情况下,它意味着列B应该只包含数字(或空)。 你可以用类似的方法检查这个

      select columnB from table where not columnB ~ E'^[0-9]+$';
    

    如果要将空字符串转换为空整数,请先运行

      UPDATE table set  columnB = NULL WHERE columnB = '';