- ベストアンサー
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 という欲しい答えが得られます。 これはどういうことなんでしょうか? 全然わかりません。 どなたか分かる方がいらっしゃいましたら、ご回答願います。 よろしくお願いいたします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 先頭の空白って、符号の領域じゃないでしょうか? select substr(to_char('1234567', 'FM09999999'), 2, 6) from dual; とすると、以下のようになりました。 SUBSTR(TO_CHAR('12 ------------------ 123456
その他の回答 (2)
- blood_kazuaki
- ベストアンサー率40% (39/96)
#1です~ > FMを指定しない時の左の空白一文字は、負値のマイナス記号用のスペースです。 > 負の値をTMP_TBLに入れてSELECTすると、左に空白一文字が付与されません。 そんなことがあったんですねぇ、、、 符号のスペースなんていらないですけど、、、 #2さん、お勉強になりました。 ありがとうございました。
- blood_kazuaki
- ベストアンサー率40% (39/96)
こんにちは。 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関数のバグなんですかねぇ、、、