在Oracle 11.2中,是否有一些数字格式,nf,它将与to_number一起解析包含数字和逗号的任意长度varchar2?
我可以使用regexp_replace在没有数字格式的情况下实现这一点,但我更喜欢使用数字格式来实现相同的功能。
例如,以下两个陈述有效: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 :(得分: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
group 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 :(得分:0)
为此:
select to_number('1,234,567', nf) from dual;
使用nf = 9,999,999即可。
答案 2 :(得分:0)
虽然我支持Alex Poole的答案,但这是解决问题的另一种原始但有效的方法,它应该比执行正则表达式更好。
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做一些稍微复杂的事情,以确保你生成正确的掩码。