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

Michihide Hotta hotta @ net-newbie.com
2013年 1月 10日 (木) 15:44:43 JST


笠原さま

堀田です。

ご教示いただいた方法の、どちらでやってもうまくいきました!
ありがとうございます。

2013年1月10日 15:23  <kasaharatt @ nttdata.co.jp>:
> 笠原と申します。
>
>> 「古いデータ型から新しいデータ型への暗黙キャストあるいは代入
>> キャストがない場合、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>



--
HOTTA Michihide <hotta @ net-newbie.com>


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