34

重複の可能性:
postgresql 8.4で列のデータ型を文字から数値に変更する方法

varchar 型のフィールドがある (すべての値が null または数値の文字列表現である) 場合、alter table を使用してこの列の型を bigint に変換するにはどうすればよいですか?

4

3 に答える 3

94

文字列を解析するだけで変換するには (キャスト):

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

実際、変換をカスタマイズするthe_column代わりに、任意の式を使用できます。the_column::bigint

これによりテーブルが書き換えられ、完了するまでリーダーもロックアウトされることに注意してください。

于 2012-12-10T21:49:19.270 に答える
5

タイプの一時的な列を作成し、次のbigintようにSQLを実行できます

UPDATE my_table SET bigint_column=varchar_column::bigint;

次に、varchar_column をドロップして、bigint_column の名前を変更します。これはちょっと回り道ですが、postgres でのカスタム キャストは必要ありません。

于 2012-12-10T21:12:17.350 に答える
0

postgresql で文字列列タイプを数値または bigint に変換する方法

string から 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次に、string 列を 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数字、空白文字列、null、制御文字、およびその他の奇妙な文字列を処理するには、変更が必要になる場合があります。

次に、最初のテーブルを削除し、2 番目のテーブルの名前を最初のテーブルに変更します。

于 2012-12-10T21:07:13.967 に答える