【问题标题】:Postgres Alter table to convert column type from char to bigint [duplicate]Postgres Alter表将列类型从char转换为bigint [重复]
【发布时间】:2012-12-11 05:49:19
【问题描述】:

可能重复:
how to change column datatype from character to numeric in postgresql 8.4

如果我有一个 varchar 类型的字段(并且所有值都是 null 或数字的字符串表示形式),我如何使用 alter table 将此列类型转换为 bigint?

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    仅通过解析字符串进行转换(强制转换):

    alter table the_table alter column the_column type bigint using the_column::bigint
    

    其实你可以用the_column的任意表达式代替the_column::bigint来自定义转换。

    请注意,这将重写表格,甚至在完成之前锁定读者。

    【讨论】:

    • 太棒了!这显然使我的回答错误。所以我删除了它。并学到了一些新东西。
    【解决方案2】:

    你可以创建一个bigint类型的临时列,然后像这样执行SQL

    UPDATE my_table SET bigint_column=varchar_column::bigint;
    

    然后删除您的 varchar_column 并重命名 bigint_column。这有点迂回,但不需要在 postgres 中进行自定义转换。

    【讨论】:

      【解决方案3】:

      如何在 postgresql 中将字符串列类型转换为 numeric 或 bigint

      设计您自己的从字符串到 bigint 的自定义转换。像这样的:

      CREATE OR REPLACE FUNCTION convert_to_bigint(v_input text)
      RETURNS BIGINT AS $$
      DECLARE v_bigint_value BIGINT DEFAULT NULL;
      BEGIN
          BEGIN
              v_bigint_value := v_input::BIGINT;
          EXCEPTION WHEN OTHERS THEN
              RAISE NOTICE 'Invalid bigint value: "%".  Returning something else.', v_input;
              RETURN 0;
          END;
      RETURN v_bigint_value;
      END;
      

      然后创建一个新表fixed_table_with_bigint,参数与旧表相同,只是将字符串列改为bigint列。

      然后将前一个表中的所有行(使用自定义转换 convert_to_integer )插入到新表中:

      insert into fixed_table_with_bigint
      select mycolumn1, 
             convert_to_bigint(your_string_bigint_column),
             mycolumn3
          from incorrect_table
      

      您可能必须修改convert_to_bigint 以处理不是数字、空白字符串、空值、控制字符和其他怪异的字符串。

      然后删除第一张表,将第二张表重命名为第一张表。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-05-25
        • 1970-01-01
        • 2016-02-26
        • 1970-01-01
        • 2019-09-29
        • 2015-11-05
        • 1970-01-01
        • 2020-04-24
        相关资源
        最近更新 更多