2013-02-12 88 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