dポイントプレゼントキャンペーン実施中!

こんにちは。
現在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

という欲しい答えが得られます。
これはどういうことなんでしょうか?
全然わかりません。
どなたか分かる方がいらっしゃいましたら、ご回答願います。

よろしくお願いいたします。

A 回答 (3件)

こんにちわ。



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

SUBSTR(TO_CHAR('12
------------------
123456
    • good
    • 0

#1です~



> FMを指定しない時の左の空白一文字は、負値のマイナス記号用のスペースです。
> 負の値をTMP_TBLに入れてSELECTすると、左に空白一文字が付与されません。


そんなことがあったんですねぇ、、、
符号のスペースなんていらないですけど、、、


#2さん、お勉強になりました。
ありがとうございました。

参考URL:http://tsubosak.hp.infoseek.co.jp/2-10/7-column. …
    • good
    • 0

こんにちは。


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関数のバグなんですかねぇ、、、
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!