[pgsql-jp: 41313] ALTER COLUMN の USING 句

Michihide Hotta hotta @ net-newbie.com
2013年 1月 10日 (木) 14:41:53 JST


堀田@長崎市と申します。本年もよろしくお願いします。

SQL の文法について質問させてください。
以下のようなテーブルがあります。

CREATE TABLE a(d TEXT);
INSERT INTO a VALUES('        ');
INSERT INTO a VALUES('99999999');

カラム d には本来 '20120109' のような8桁の日付が入ってくるの
ですが、業務的に日付の最小値としてスペース、最大値として
オール 9 が入ってくるため、DATE 型として定義すると INSERT
(実際は CSV ファイルからの COPY 文による取り込み)時に制約
エラーとなります。

DATE 型にできれば PostgreSQL(バージョン 9.2.1 )に日付の
計算をしてもらえて便利なので、以下のようなことを考えました。

UPDATE a SET d='-infinite' WHERE d='        ';
UPDATE a SET d='infinite' WHERE d='99999999';
ALTER TABLE a ALTER COLUMN d SET DATA TYPE DATE;

これでうまくいくと思ったのですが、以下のように怒られました。

ERROR:  列"d"を型dateにキャストできません
HINT:  変換を行うためにUSING式を指定してください

http://www.postgresql.jp/document/9.2/html/sql-altertable.html

「古いデータ型から新しいデータ型への暗黙キャストあるいは代入
キャストがない場合、USING句を指定しなければなりません。」
だそうですが、USING 句をどう書けばよいかご教示いただけない
でしょうか。

PS.
sed の正規表現を駆使して CSV ファイル自体を書き換えることも
考えたのですが、CSV ファイルの種類や項目数が多いため、
できれば視認性が高い SQL でやりたいと思っています。
--
HOTTA Michihide <hotta @ net-newbie.com>


pgsql-jp メーリングリストの案内