• ベストアンサー

SUBSTR関数の結果が予想と異なる

こんにちは。 現在Oracle8.1.7.4でSUBSTR関数を使っているのですが、 私の考えだと、下のSQLを実行すると、'123456'が戻ると思っていたのですが、 '012345'が戻ってきますこれはどういうことでしょうか? SELECT SUBSTR(TO_CHAR('1234567','00000000'),2,6) FROM DUAL; SUBSTR(TO_CHAR('12 ------------------ 012345 と表示されてしまいます。 これを、 SELECT SUBSTR(TO_CHAR('1234567','00000000'),3,6) FROM DUAL; に変更すると、 SUBSTR(TO_CHAR('12 ------------------ 123456 という欲しい答えが得られます。 これはどういうことなんでしょうか? 全然わかりません。 どなたか分かる方がいらっしゃいましたら、ご回答願います。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 先頭の空白って、符号の領域じゃないでしょうか? select substr(to_char('1234567', 'FM09999999'), 2, 6) from dual; とすると、以下のようになりました。 SUBSTR(TO_CHAR('12 ------------------ 123456

その他の回答 (2)

回答No.3

#1です~ > FMを指定しない時の左の空白一文字は、負値のマイナス記号用のスペースです。 > 負の値をTMP_TBLに入れてSELECTすると、左に空白一文字が付与されません。 そんなことがあったんですねぇ、、、 符号のスペースなんていらないですけど、、、 #2さん、お勉強になりました。 ありがとうございました。

参考URL:
http://tsubosak.hp.infoseek.co.jp/2-10/7-column.html
回答No.1

こんにちは。 Oracle9.2.0.1でテストしました。 同様の現象が再現しました。 SUBSTR(TO_CHAR('12 ------------------ 012345 ↑ このサイトでは半角の空白が削除されますが 一番左に空白がありましたよね? なぜか、一番左に空白が入るみたいです。 ですので、結論としてはTRIMをかけてからSUBSTRすれば、希望の値が取得できます。 SQLは以下の通りになります。 SELECT SUBSTR(TRIM(TO_CHAR('1234567','00000000')),2,6) FROM DUAL; んーTO_CHAR関数のバグなんですかねぇ、、、

関連するQ&A