6

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)'

ただし、一部の列がnullであるため、このインスタンスではキャストは機能しません。

何か案は?

エラー:

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

Postgres v8.3

4

2 に答える 2

13

問題は、テーブルに空の文字列があることのようです。これらは、おそらく次のようなcaseステートメントで処理する必要があります。

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

更新:更新された質問に基づいて完全に書き直されました。

于 2010-05-21T12:03:02.853 に答える
2

ここではNULLは問題になりません。postgresqlのバージョンとエラーメッセージを教えてください。その上、なぜあなたは識別子を引用しているのですか?引用符で囲まれていない識別子は小文字(デフォルトの動作)に変換されるため、クエリの「columnB」に問題がある可能性があることに注意してください。キャストでは引用符で囲まれていない最初に引用符で囲まれているように見えます。

更新:列を整数に変換する前に、すべての値が変換可能であることを確認する必要があります。この場合、columnBには数字(またはnull)のみを含める必要があることを意味します。これは次のように確認できます

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

空の文字列をNULL整数に変換する場合は、最初に実行します

  UPDATE table set  columnB = NULL WHERE columnB = '';
于 2010-05-21T12:09:38.420 に答える