1

在 Oracle 11.2 中,是否有某种数字格式 nf 可以与 to_number 一起使用来解析包含数字和逗号的任意长度的 varchar2?

通过使用 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是一个适用于两种语句的数字格式字符串。

如果我尝试nf = '99,999',第一个语句有效,但第二个语句失败。

谢谢。

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

为了这 :

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

使用 nf = 9,999,999 将起作用。

于 2013-02-12T07:30:43.357 回答
0

尽管我支持 Alex Poole 的回答,但这是解决问题的另一种粗略但有效的方法,它应该比执行正则表达式更好。

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 回答