web-dev-qa-db-ja.com

列のデータ型を整数から通貨に変更するにはどうすればよいですか?

PostgreSQLのテーブル列を整数から通貨に変換しようとしていますが、次のエラーが表示されます。

タイプMyColumnをマネーにキャストできません

私はこれら2つのステートメントを試してみましたが、実際にそれを行う方法についての実際の例を見つけていません。

ALTER TABLE products 
    ALTER COLUMN price TYPE money

そして:

ALTER TABLE products 
    ALTER COLUMN price TYPE money USING to_char(price, '999.99')

PostgreSQL列のデータ型を整数から通貨に変更するにはどうすればよいですか?

6
Gabriel

次のコマンドを試してください。

ALTER TABLE products ALTER COLUMN price TYPE money using price::text::money

引用符で囲まれていない数値は、数値をテキストにキャストしてからmoneyに変換することでmoneyに変換できます。

8
francs

試す

ALTER TABLE products 
    ALTER COLUMN price TYPE money USING price::money

ところで、2回目の試行でどのエラーが発生しましたか?

4
Scott Marlowe

francs はすでに暗示されているため、 整数からマネーへのデフォルトのキャストはありません9.1 まで)があり、代わりにテキストへの中間キャストが必要です。

_select 78::integer::money;
ERROR:  cannot cast type integer to money
LINE 1: select 78::integer::money;
                          ^
select 78::integer::text::money;
 money
--------
 £78.00
_

ただし、エラーはわずかです。 select to_char(78, '999.99')::moneyは成功しますが、以下は失敗することに注意してください:

_alter table products alter column price type money using to_char(price, '999.99');
ERROR:  column "price" cannot be cast to type money
_

しかし、明示的なキャストでは成功します:

_alter table products alter column price type money using to_char(price, '999.99')::money;
ALTER TABLE
_

これは私にはバグのようです-私はまだテストする9.0または9.1を持っていません。うまくいけば、それらのバージョンで修正されているのか、それともバグとして報告する必要があるのか​​、他の誰かが言うことはできません。


余談ですが、price> = 1000の行がある場合、明示的なキャストを使用しても元のエラーはもちろん失敗します。

_alter table products alter column price type money using to_char(price, '999.99')::money;
ERROR:  invalid input syntax for type money: " ###.##"
_