TO_NUMBER 忽略逗号,即使它不在格式模型中

TO_NUMBER ignores comma even when it's not in format model

我刚刚注意到这一点,但对我来说没有任何意义:

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

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

编辑:

我在 Oracle XE (11gR2) 和 12cR2 上注意到了这一点。 SQLFiddle 示例。

它是 Oracle 中的那些 "features" 之一,我不一定是它的超级粉丝。尝试转换时,如果我们确信转换中没有歧义,我们将尝试 "help" 查看是否可以转换,例如

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

因此,即使字符串与格式掩码不匹配,由于对输入格式的信任,数据库仍然执行了转换。