[pgsql-jp: 41314] Re: ALTER COLUMN の USING 句

kasaharatt @ nttdata.co.jp kasaharatt @ nttdata.co.jp
2013年 1月 10日 (木) 15:23:10 JST


笠原と申します。

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

ALTER TABLE a ALTER COLUMN d SET DATA TYPE DATE USING CAST(d AS date);
もしくは
ALTER TABLE a ALTER COLUMN d SET DATA TYPE DATE USING d::date;
でどうでしょうか?

> -----Original Message-----
> From: pgsql-jp-bounces @ ml.postgresql.jp [mailto:pgsql-jp-bounces @ ml.postgresql.jp] On Behalf Of Michihide Hotta
> Sent: Thursday, January 10, 2013 2:42 PM
> To: pgsql-jp @ ml.postgresql.jp
> Subject: [pgsql-jp: 41313] ALTER COLUMN の USING 句
> 
> 堀田@長崎市と申します。本年もよろしくお願いします。
> 
> 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 メーリングリストの案内