代码之家  ›  专栏  ›  技术社区  ›  eaolson

to_数字忽略逗号,即使它不在格式模型中

  •  1
  • eaolson  · 技术社区  · 7 年前

    我刚注意到这一点,对我来说毫无意义:

    select to_number( '10000', '999G990' ) from dual;
    
    ORA-01722: invalid number
    

    好的,这是有意义的,格式模型包含 G ,组分隔符与字符串不匹配,因此引发了ora-01722。

    select to_number( '10,000', '999990' ) as x from dual;
    
             X
    ----------
         10000
    

    但在这种情况下,我的格式模型 包含组分隔符,而我的字符串包含。那么ORA-01722不应该再被培养吗?

    完全没有意义,

    select to_number( '10,0000', '999990' ) as x from dual;
    
             X
    ----------
        100000
    

    等等,什么?100000甚至不是一个有效的数字。当组分隔符不在格式模型中时,是否只忽略组分隔符?我在文档中的任何地方都找不到关于这个的任何信息。

    编辑:

    我在Oracle XE(11GR2)和12CR2上注意到了这一点。 SQLFiddle 例子。

    1 回复  |  直到 7 年前
        1
  •  3
  •   Connor McDonald    7 年前

    它是Oracle中的一个“特性”,我不一定是它的超级粉丝。在尝试转换时,如果我们确信转换过程中没有歧义,我们将尝试通过查看转换是否可能来“帮助”,例如

    SQL> select to_number( '10,000', '999990' ) as x from dual;
    
             X
    ----------
         10000
    
    SQL> select to_number( '10,00000,0', '9999999990' ) as x from dual;
    
             X
    ----------
      10000000
    

    约会也有类似的行为,如

    SQL> select to_date('01-MAR-2000','dd/mm/yyyy') from dual;
    
    TO_DATE('01
    -----------
    01-MAR-2000
    

    因此,尽管字符串与格式掩码不匹配,但由于对输入格式有信心,数据库仍然执行了转换。