PostgreSQL 8.4で列のデータ型を文字から数値に変更する方法


136

私は次のクエリを使用しています:

ALTER TABLE presales ALTER COLUMN code TYPE numeric(10,0); 

列のデータ型を変更するcharacter(20)numeric(10,0)が、私はエラーを取得しています:

列「コード」は数値型にキャストできません

回答:


240

次を使用して試すことができますUSING

オプションのUSING句は、古い列の値から新しい列の値を計算する方法を指定します。省略した場合、デフォルトの変換は、古いデータ型から新しいデータ型への代入キャストと同じです。USING暗黙または新しいタイプに古いからキャスト割り当てが存在しない場合句が提供されなければなりません。

だからこれはうまくいくかもしれません(あなたのデータに依存します):

alter table presales alter column code type numeric(10,0) using code::numeric;
-- Or if you prefer standard casting...
alter table presales alter column code type numeric(10,0) using cast(code as numeric);

code数値にキャストできないものがある場合、これは失敗します。USINGが失敗した場合、列タイプを変更する前に、非数値データを手動でクリーンアップする必要があります。


この列は別のテーブルで外部キーとして使用されています。そのデータ型も変更する必要があると思いますか?
user728630

2
@ user728630:FKを削除し、両方の列を変更してから、FKを追加し直す必要があります。試してみるテストデータベースと本番データベースのバックアップがありますよね?
muが短すぎます

外部キー制約を削除し、データ型を変更しましたが、その後FKを追加できません。次のエラーを取得するエラー:テーブル "invoices"の挿入または更新は外部キー制約 "invoice_presale_fk"に違反しています詳細:キー(sale、cpf_cnpj)=(4,05943560000101)がテーブル "presales"に存在しません。
user728630

2
@funwhilelostそれは型キャストです。リンクされたALTER TABLEドキュメントは、USINGで使用できるものをカバーしています。
muが短すぎる

3
@muistooshort私はそれが実際に式であるドキュメントから見る。それはもっと理にかなっています。タイプキャストは私を油断させた。最終的にTYPE varchar(255) USING (substring(formertextcolumn from 1 for 255))
funwhilelost 2016年

7

VARCHAR列に空の文字列が含まれている場合(覚えているかもしれませんがPostgreSQL と同じではありませんNULL)、次の行で何かを使用してデフォルトを設定する必要があります。

ALTER TABLE presales ALTER COLUMN code TYPE NUMERIC(10,0)
            USING COALESCE(NULLIF(code, '')::NUMERIC, 0);

この答えの助けを借りて見つかりました)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.