[pgsql-jp: 30866] Re: to_numberでFormat エラーになります
T.Suzuki
t_suzuki @ kenwood-eng.co.jp
2003年 8月 30日 (土) 19:03:37 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は問題ない
ですが、'' ではエラーとなります。
ちなみに、NULLと '' (0桁の文字列)を手軽に見分ける方法として、
私は length()で調べてます。
SELECT length(birthday);
length
-------
0
(1 row)
0と表示されるレコードがあれば、'' (0桁の文字列)があるのが解ります。
Wrote: 石田さん
> > substr(birthday, 5, 2) が空白などを返さないかを調べて
> > みてはどうでしょうか?
というのは、NULL値ではなく、「'' が無いですか?」という事だと思います。
> データベースを確認したところ、確かにNullが入っているデータもあるのですが、
> テスト環境にもNull値があるのです。(というより、テスト環境のほうが圧倒的に
多
> いです。)
> しかし、テスト環境では、エラーにはならず、正しい件数が返ってきます。
予測ですが、運用環境のbirthdayに '' が入っているのでは?
#データを移行する際や、アプリケーションの問題でNULLじゃなく、
# '' を入力してハマル事が良くあります。
余計なお世話かもしれませんが、to_numberは私もハマッタ経験があるので、
参考までに。
(to_number(substr(birthday,5,2),'99') = 9 )
↓
(date_part('month', to_date(birthday, 'YYYYMMDD')) = '9')
のような感じでやれば、birthday が NULLだろうと '' だろうとSQLがエラー
になる事はないかと思います。
-----------------------------------------
鈴木 徹 (SUZUKI Toru)
KENWOOD ENGINEERING CORPORATION
E-mail:t_suzuki @ kenwood-eng.co.jp
-----------------------------------------
pgsql-jp メーリングリストの案内