2013-02-12 86 views
1

在Oracle 11.2中,是否有一些数字格式nf与to_number一起使用来解析包含数字和逗号的任意长度的varchar2s?Oracle 11.2 to_number多个逗号

我可以通过使用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',第一条语句有效,但第二条语句失败。

谢谢。

回答

0

虽然我支持亚历克斯·普尔的答案,这里是另一种原油,但有效解决问题的方法应该比执行正则表达式更好。

SQL Fiddle

的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 

Results

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

如果您需要匹配逗号,那么您可以对INSTR和LPAD做一些更复杂的操作,以确保生成正确的掩码。

0

对于这一点:

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

使用NF = 9,999,999将工作。

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 

我已经使用了Ggroup separator而不是一个固定的逗号来支持全球化,但效果是一样的。

唯一需要注意的是,源数量必须有正确的组合,这样它的格式完全匹配的数字它确实有:

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

select to_number('1,2345', 
       * 
ERROR at line 1: 
ORA-01722: invalid number 
+1

替代任何支持长度的字符串的更短的解决方案:http://stackoverflow.com/a/4143834/603516 – Vadzim 2015-01-15 16:44:53

+0

@Vadzim - 有趣的是,我刚刚重新创建,并即将添加到此答案。但现在我看到我已经提出了文森特的回答,所以也许它一直潜伏在我的脑海里......由于分隔符位置不固定,“translate”可能会与我给出的最后一个示例一起工作,并且可以使用小数。谢谢。 – 2015-01-15 16:49:09