2017-09-19 10 views
1

これは数ヶ月前のことですが、これをカバーするSOの質問が出ましたが、今は見つからないようです。PostgreSQL 9.6の特定のデータ型のテーブル内のすべてのカラムを変更してください。

基本的に、私は2つのことをしたい。

最初にいくつかのカラムが複数のカラムで作成されたnumeric(20,2)とし、それらをすべてnumericに変更したいとします。この文は、1つの列に対して十分に単純です。

ALTER TABLE table_name 
ALTER COLUMN code 
TYPE numeric; 

これを処理します。

第二には、これらの列に私はすべての末尾のゼロを削除する:

UPDATE table_name 
SET code = replace(replace(code::text, '.50', '.5'), '.00', '')::numeric; 

持つ難しさは、それを自動化する方法を考え出すので、私は唯一のテーブルを指定する必要があり、それはテーブルをクリーンアップします。確かにこれが可能であることを確かめてください。

答えて

3

あなたが好き文で変更したいデータ型を持つ列のすべてを見つけることができます:

select column_name, table_name 
from information_schema.columns 
where data_type='numeric' 
    and numeric_precision = 20 
    and numeric_scale = 2; 

カスタム機能付きまたはDOコマンドなどで結果を反復処理することができます。

do $$ 
begin 
    for t IN select column_name, table_name 
      from information_schema.columns 
      where data_type='numeric' 
       and numeric_precision = 20 
       and numeric_scale = 2; 
    loop 
     execute 'alter table ' || t.table_name || ' alter column ' || t.column_name || ' type numeric'; 
    end loop; 
end$$; 

また、末尾のゼロを削除するには、より一般的な解決策は、例えば、バックの数値に続いフロートまたは倍精度とする値をキャストすることです:

set code = cast(cast(code as double precision) as numeric); 
+1

数値データ型に '末尾ゼロ 'のようなものはありません... – Abelisto

+0

' select cast(' 1234.50 'を数値として); '末尾にゼロを表示します。' select cast(cast(cast(' 1234.50 'を数値として)を倍精度として)数値として返します;;は後続のゼロを伴わずに表示されます。 –

+0

ああ、そうだよ。正に、 '数値型 'は各値の初期精度を個別に保持することは驚きです。私にそれを指摘してくれてありがとう。 – Abelisto

関連する問題