1

Oracle 11.2では、to_numberと連動して数字とコンマを含む任意の長さのvarchar2を解析する数値形式nfはありますか?

regexp_replaceを使用することで、数値形式なしでこれを実現できますが、数値形式だけを使用して同じことを実現したいと思います。

たとえば、次の2つのステートメントが機能します。

select to_number(regexp_replace('12,345', ',', '')) from dual;

select to_number(regexp_replace('1,234,567', ',', '')) from dual;

しかし、私は好む:

select to_number('12,345', nf) from dual;

select to_number('1,234,567', nf) from dual;

ここで、nfは両方のステートメントで機能する1つの数値フォーマット文字列です。

を試してみるnf = '99,999'と、最初のステートメントは機能しますが、2番目のステートメントは失敗します。

ありがとう。

4

3 に答える 3

2

数値形式が長すぎても Oracle は文句を言わないので、受け取ることができる最大の数値に対処するのに十分な桁数を持つモデルを使用できます。

SQL> select to_number('12,345',
  2  '999G999G999G999G999G999G999G999G999G999G999G999G999') from dual;


TO_NUMBER('12,345','999G999G999G999G999G999G999G999G999G999G999G999G999')
-------------------------------------------------------------------------
                                                                    12345

SQL> select to_number('1,234,567',
  2  '999G999G999G999G999G999G999G999G999G999G999G999G999') from dual;

TO_NUMBER('1,234,567','999G999G999G999G999G999G999G999G999G999G999G999G999')
----------------------------------------------------------------------------
                                                                     1234567

SQL> select to_number('999,999,999,999,999,999,999,999,999,999,999,999,999',
  2  '999G999G999G999G999G999G999G999G999G999G999G999G999') from dual;

TO_NUMBER('999,999,999,999,999,999,999,999,999,999,999,999,999','999G999G999G999
--------------------------------------------------------------------------------
                                                                      1.0000E+39

グローバリゼーションをサポートするために、固定コンマの代わりにG グループ セパレータを使用しましたが、効果は同じです。

唯一の注意点は、ソース番号が正しいグループ化を持っている必要があるため、それが持っている数字のフォーマットと正確に一致することです:

SQL> select to_number('1,2345',
  2  '999G999G999G999G999G999G999G999G999G999G999G999G999') from dual;

select to_number('1,2345',
                 *
ERROR at line 1:
ORA-01722: invalid number
于 2013-02-12T10:04:23.187 に答える
0

私はAlexPooleの答えを支持しますが、正規表現を実行するよりもパフォーマンスが優れているはずの問題を解決するための、もう1つの大雑把で効果的な方法があります。

SQLフィドル

Oracle 11g R2スキーマのセットアップ

CREATE TABLE table_of_numbers (
  example_num VARCHAR2(50)
)
/

INSERT INTO table_of_numbers (example_num)
VALUES ('12,345')
/

INSERT INTO table_of_numbers (example_num)
VALUES ('1,234,567')
/

クエリ1

SELECT TO_NUMBER(example_num, RPAD('9', LENGTH(example_num) - 1, '9')) fudge
FROM table_of_numbers

結果

|   FUDGE |
-----------
|   12345 |
| 1234567 |

カンマを一致させる必要がある場合は、INSTRとLPADを使用してもう少し洗練された方法を実行して、正しいマスクを確実に生成することができます。

于 2013-02-12T22:13:02.043 に答える
0

このため :

select to_number('1,234,567', nf) from dual;

nf = 9,999,999 を使用するとうまくいきます。

于 2013-02-12T07:30:43.357 に答える