[pgsql-jp: 30869] Re: to_numberでFormat エラーになります

gotou gotou @ hokkou.co.jp
2003年 8月 30日 (土) 21:02:11 JST


ごとうです。

石田様、鈴木様、谷口様ありがとうございました。

>
> 鈴木@KEGと申します。
>
> NULL値 と '' (0桁の文字列)は、違うという事をまず始めに。
>
そうですね。すいません。
ちょっと誤解をしてしまいました。

> birthdayがNULL値の場合、substr(birthday, 5, 2)ではNULLを返しますが、
> birthdayが '' (0桁の文字列)の場合、'' を返します。
>
> Wrote: ごとうさん
> -省略-
> > > > AND customer_base_mst.st_cd in ('xxxxx')
> > > > AND (to_number(substr(birthday,5,2),'99') = 9 );
>
> 従って、上記のSQL文では、to_number()に '' が渡される可能性があります。
> 谷口、石田さんが実験された通り、to_number()の引数には NULLは問題ない
> ですが、'' ではエラーとなります。
>
>
>
> 予測ですが、運用環境のbirthdayに '' が入っているのでは?
> #データを移行する際や、アプリケーションの問題でNULLじゃなく、
> # '' を入力してハマル事が良くあります。
>
データベースで確認したところ、''の値は入ってないようです。
---null
select count(cust_cd) from customer_add_mst where birthday is null;
 count
-------
   330

---''
select count(cust_cd) from customer_add_mst where birthday='';
 count
-------
     0

> 余計なお世話かもしれませんが、to_numberは私もハマッタ経験があるので、
> 参考までに。
>
> (to_number(substr(birthday,5,2),'99') = 9 )
>  ↓
> (date_part('month', to_date(birthday, 'YYYYMMDD')) = '9')
>
> のような感じでやれば、birthday が NULLだろうと '' だろうとSQLがエラー
> になる事はないかと思います。

上記の鈴木様のようにソースを修正したところ、テスト環境では問題なく動作いたし
ました。
これから、メインサーバのほうで、動作を確認してみます。




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