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);
できた!(・∀・)
上下お好みの方でどうぞ。