【问题标题】:Oracle 11.2 to_number multiple commasOracle 11.2 to_number 多个逗号
【发布时间】:2013-02-12 07:19:57
【问题描述】:

在 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',第一个语句有效,但第二个语句失败。

谢谢。

【问题讨论】:

    标签: oracle oracle11gr2 number-formatting


    【解决方案1】:

    如果数字格式太长,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
    

    【讨论】:

    • 任何受支持长度的字符串的替代更短解决方案:stackoverflow.com/a/4143834/603516
    • @Vadzim - 有趣的是,我刚刚重新发明了它,并准备将它添加到这个答案中。但是现在我看到我已经赞成文森特的答案,所以也许它一直潜伏在我的大脑后面......也许显着的区别是translate 将与我给出的最后一个示例一起使用,因为分隔符位置不固定, 它适用于小数。谢谢。
    【解决方案2】:

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

    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 做一些更复杂的操作,以确保生成正确的掩码。

    【讨论】:

      【解决方案3】:

      为此:

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

      使用 nf = 9,999,999 即可。

      【讨论】:

        猜你喜欢
        • 2020-11-28
        • 2017-12-19
        • 2013-09-17
        • 2018-11-03
        • 2021-07-22
        • 2018-08-20
        • 2011-08-24
        • 1970-01-01
        相关资源
        最近更新 更多