[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 メーリングリストの案内