PostgreSQLで文字型カラムから数値型カラムへ変更する

今までVARCHARで持っていたデータを、数値しか入れないってことでINTEGER型に変えることになったんだけど、ALTER TABLEがうまくいかなくてプチハマリ。

ALTER TABLE foo ALTER COLUMN bar TYPE INTEGER;

何の考えも無しにやってみたら案の定エラーになった。
そりゃあ文字列が入ってるのに数値型にはできないよなぁ。人間から見れば数字しか入ってないんだけどね。


つーわけで、なんか方法あんだろと思ってマニュアル見たら、USING句というのを使えばいいらしいことがわかった。
これで変換規則を指定してやるらしい。
ただし、PostgreSQLのマニュアルの例はわかりにくい。


USING句を使用して、Unixタイムスタンプを持つinteger型の列をtimestamp with time zoneに変更します。
ALTER TABLE foo
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';


よくわからんので、直感に従ってやってみる。

ALTER TABLE foo ALTER COLUMN bar TYPE INTEGER USING to_number(bar, 'S9999999999');
ALTER TABLE foo ALTER COLUMN bar TYPE INTEGER USING CAST(bar AS INTEGER);

できた!(・∀・)
上下お好みの方でどうぞ。